home *** CD-ROM | disk | FTP | other *** search
/ BBS Toolkit / BBS Toolkit.iso / rbbs_pc / mpl17ds.zip / CNFG-SUB.BAS next >
BASIC Source File  |  1989-06-04  |  95KB  |  2,181 lines

  1. ' $linesize:132
  2. ' $title: 'CNFG-SUB.BAS CPC17-2A, Copyright 1987-89 by D. Thomas Mack'
  3. '  Copyright 1987,1988 and 1989 by D. Thomas Mack, all rights reserved.
  4. '  Name ...............: CNFG-SUB.BAS
  5. '  Written by .........: D. Thomas Mack
  6. '  First Released .....: September 18, 1988
  7. '  Subsequent Releases.: October 30, 1988; Dec 11, 1988; May 21, 1989
  8. '  Copyright ..........: 1987-89
  9. '  Purpose.............: The Remote Bulletin Board System for the IBM PC,
  10. '                        RBBS-PC, configuration program -- CONFIG.BAS
  11. '                        utilizes a lot of menus and string space.
  12. '                        These are incorporated within CNFG-SUB.BAS as a
  13. '                        seperately callable subroutines in order to free
  14. '                        up as much code as possible within the 64K code
  15. '                        segment used by CONFIG.BAS.
  16. '  Parameters..........: Most parameters are passed via a COMMON statement.
  17. '
  18. ' Subroutine  Line      Function of Subroutine
  19. '    Name    Number
  20. ' ALLCAPS    61212+     Captialize a string
  21. ' ANSIDECODE 62040+     Convert ANSI strings into english text expressions
  22. ' ANYINTEGER 61450      Prompt for any integer
  23. ' ANYNUMBER  61400      Prompt for any number
  24. ' ASKRO      61100      Ask a question on a specific row
  25. ' ASKUPOS    61300      Ask for identifying field in USERS record
  26. ' BRKFNAME   61830      Break file name in drive/path, prefix, extension
  27. ' CHKFMSDIR  61700      Check FMS directory for valid structure
  28. ' CHKPERSDIR 61755      Check Personal directory format
  29. ' CNFGINIT   60385      Initialize CONFIG's constants
  30. ' COLORCODE  62040+     Convert response into ANSI-meaningful strings
  31. ' DISPLAY    12190      Display the CONFIG menu pages
  32. ' FINDFILE   61600      Determine whether a file exists
  33. ' FINDLAST   61850      Find last occurence of a character in a string
  34. ' GETANSI    62000      Prompt for ANSI colors to be used
  35. ' GETASCII   61810      Get any character by character or ascii value
  36. ' GETCOLOR   61950      Process request for setting color
  37. ' GETINIT    61110      Get answers that are integers
  38. ' GETNUMYN   61150      Get TRUE/FALSE answer to a YES/NO question
  39. ' GETYESNO   61200      Ask a question with a "yes" or "no" response
  40. ' HANDERR    61775+     Handle error checking for FMS directories
  41. ' MMINTEGER  61500      Prompt for integer with min and a max
  42. ' NETTYPE    60382      Prompt for supported network types
  43. ' REMOVE     61800      Remove characters from a string
  44. ' SECURE     61860      Allow commands and their security level to be changed
  45. ' TRIMTRAIL  61840      Remove trailing characters from a string
  46. '
  47. '  $INCLUDE: 'CNFG-VAR.BAS'
  48. '
  49. '  $SUBTITLE: 'DISPLAY - subroutine to display CONFIG's menus'
  50. '  $PAGE
  51. '
  52. '  SUBROUTINE NAME    --  DISPLAY
  53. '
  54. '  INPUT PARAMETERS   --  PARAMETER        DESCRIPTION
  55. '                         IX = 0           DISPLAY THE CHOICE OF MENUS
  56. '                         IX = -1          RE-READ THE INPUT (INVALID REQUEST)
  57. '                         IX > 0           DISPLAY THE APPROPRIATE PAGE
  58. '
  59. '  OUTPUT PARAMETERS  --  HJ$              OPTION SELECTED
  60. '                         IPAGE            MENU PAGE CONTAINING OPTION
  61. '                         ILOOKUP          INDEX (1 TO 20) OF OPTION SELECTED
  62. '
  63. '  SUBROUTINE PURPOSE --  TO DISPLAY CONFIG'S MENUS AND REQUEST OPTION
  64. '
  65.       SUB DISPLAY STATIC
  66. '
  67. ' *  DISPLAY CONFIG'S MAIN FUNCTION KEY MENU
  68. '
  69.       IF IX > 0 THEN _
  70.          GOTO 12320
  71.       IF IX = -1 THEN _
  72.          GOTO 12590
  73. 12190 COLOR FG,BG,BORDER
  74.       CLS
  75.       DISPLAYED.PAGE.NUMBER = 0
  76.       I! = FRE(C$)
  77.       COLOR 0,7,0
  78.       LOCATE 4,10
  79.       PRINT "Maple RBBS  "+ CONFIG.VERSION$ + " CONFIGURATION PROGRAM "
  80.       COLOR FG,BG,BORDER
  81.       LOCATE 1,1,0
  82.       PRINT "Copyright (c) 1983-1988 Tom Mack"
  83.       LOCATE 2,1,0
  84.       PRINT "39 Cranbury Dr, Trumbull, CT. 06611";
  85.       IF CONFERENCE.MODE THEN _
  86.          GOSUB 24970
  87.       LOCATE  5,1
  88.       PRINT "   F1            Global RBBS-PC Parameters (part 1)
  89.       PRINT "   F2            Global RBBS-PC Parameters (part 2)
  90.       PRINT "   F3            Global RBBS-PC Parameters (part 3)
  91.       PRINT "   F4            RBBS-PC System Files (part 1)
  92.       PRINT "   F5            RBBS-PC System Files (part 2)
  93.       PRINT "   F6            Parameters for RBBS-PC's 'Doors'
  94.       PRINT "   F7            Parameters for RBBS-PC's Security (part 1)
  95.       PRINT "   F8            Parameters for RBBS-PC's Security (part 2)
  96.       PRINT "   F9            Parameters for multiple RBBS-PC's
  97.       PRINT "  F10            RBBS-PC utilities
  98.       PRINT "  Shift-F1       RBBS-PC File Management Faciliites"
  99.       PRINT "  Shift-F2       RBBS-PC Communications Parameters (part 1)
  100.       PRINT "  Shift-F3       RBBS-PC Communications Parameters (part 2)
  101.       PRINT "  Shift-F4       Parameters for RBBS-PC NET-MAIL
  102.       PRINT "  Shift-F5       New users parameters"
  103.       PRINT "  Shift-F6       Library Sub-System"
  104.       PRINT "  Shift-F7       RBBS-PC Color parameters"
  105.       PRINT "  Shift-F8       Reserved for future use"
  106.       XX$ = "Press END to terminate or Function Key to select page for parameters shown "
  107.       GOSUB 50345
  108.       LOCATE ,,1
  109. 12310 GOSUB 22160
  110. 12320 IF IX THEN _            'IX    Key    Where to branch to
  111.          ON IX GOTO 12360, _  ' 1       F1 - Global Parameters (Part 1)
  112.                     12370, _  ' 2       F2 - Global Parameters (Part 2)
  113.                     12380, _  ' 3       F3 - Global Parameters (Part 3)
  114.                     12390, _  ' 4       F4 - RBBS-PC System Files (Part 1)
  115.                     12400, _  ' 5       F5 - RBBS-PC System Files (Part 2)
  116.                     12410, _  ' 6       F6 - RBBS-PC "doors"
  117.                     12420, _  ' 7       F7 - RBBS-PC security parms. (Part 1)
  118.                     12466, _  ' 8       F8 - RBBS-PC security parms. (Part 2)
  119.                     12470, _  ' 9       F9 - Multiple RBBS-PC parameters
  120.                     12480, _  '10      F10 - RBBS-PC's utilities
  121.                     12490, _  '11 Shift-F1 - RBBS-PC File Manager
  122.                     12500, _  '12 Shift-F2 - RBBS-PC comm. parameters (Part 1)
  123.                     12505, _  '13 Shift-F3 - RBBS-PC comm. parameters (Part 2)
  124.                     12510, _  '14 Shift-F4 - RBBS-PC Net Mail
  125.                     12520, _  '15 Shift-F5 - New user parameters
  126.                     12530, _  '16 Shift-F6 - Library parameters
  127.                     12540, _  '17 Shift-F7 - RBBS-PC Color parameters
  128.                     12310, _  '18 Shift-F8 - Reserved for future use
  129.                     12340, _  '19     PgUp - Go to previous page
  130.                     12330, _  '20     PgDn - Go to next page
  131.                     12630, _  '21      End - Terminate CONFIG
  132.                     12350     '22    Enter - Re-display current page
  133.       GOTO 12310
  134. '
  135. ' *  COMMON ROUTINE TO HANDLE UNDEFINED OPTIONS
  136. '
  137. 12325 IX = IPAGE
  138.       GOTO 12320
  139. '
  140. ' *  COMMON ROUTINE TO HANDLE PAGE UP OF DISPLAYS
  141. '
  142. 12330 IF (DISPLAYED.PAGE.NUMBER + 1 ) > 17 THEN _
  143.          GOTO 12190
  144.       IX = DISPLAYED.PAGE.NUMBER + 1
  145.       GOTO 12320
  146. '
  147. ' *  COMMON ROUTINE TO HANDLE PAGE DOWN OF DISPLAYS
  148. '
  149. 12340 IF (DISPLAYED.PAGE.NUMBER - 1) < 1 THEN _
  150.          GOTO 12190
  151.       IX = DISPLAYED.PAGE.NUMBER - 1
  152.       GOTO 12320
  153. '
  154. ' *  RETURN TO PRIMARY MENU SELECTION DISPLAY
  155. '
  156. 12350 GOSUB 60380
  157.       GOTO 12310
  158. '
  159. ' *  COMMON CONFIGURATION PROGRAM MENU AND PAGE DISPLAY
  160. '
  161. 12360 DISPLAYED.PAGE.NUMBER = 1
  162.       GOSUB 24800
  163.       LOCATE  3,1
  164.       PRINT " 1. SYSOP's Public First Name -------------------- " + SYSOP.FIRST.NAME$
  165.       PRINT " 2. SYSOP's Public Last Name --------------------- " + SYSOP.LAST.NAME$
  166.       PRINT " 3. SYSOP's default expert mode at signon -------- " + EXPERT.USER$
  167.       PRINT " 4. SYSOP's office hours -------------------------"STR$(START.OFFICE.HOURS);" to"STR$(END.OFFICE.HOURS)
  168.       PRINT " 5. Page SYSOP using printer's bell -------------- " + M11$
  169.       PRINT " 6. Go off-line whenever a DISK FULL occurs ------ " ; FNYESNO$(DISKFULL.GO.OFFLINE)
  170.       PRINT " 7. Prompt bell default is ----------------------- " + PROMPT.BELL$
  171.       PRINT " 8. Maximum time per session (in minutes) --------"STR$(MINUTES.PER.SESSION!)
  172.       PRINT " 9. Maximum minutes per day ----------------------";STR$(MAX.PER.DAY)
  173.       PRINT "10. Factor to extend session time for uploads ----" + STR$(UPLOAD.TIME.FACTOR!)
  174.       PRINT "11. # Months of inactivity before user deleted ---"STR$(ACT.MNTHS.B4.DELETING)
  175.       PRINT "12. Name of RBBS-PC shown initially is ----------- " + RBBS.NAME$
  176.       PRINT "13. Foreground color (for color monitors) is -----"STR$(FG)
  177.       PRINT "14. Background color (for color monitors) is -----"STR$(BG)
  178.       PRINT "15. The border color (for color monitors) is -----"STR$(BORDER)
  179.       PRINT "16. Your CONFIG.SYS contains 'DEVICE=ANSI.SYS'---- " + FNYESNO$(DOSANSI)
  180.       IF SMART.TEXT THEN _
  181.          SMART.TEXT$ = STR$(SMART.TEXT) _
  182.       ELSE SMART.TEXT$ = "<none>"
  183.       PRINT "17. Control character for SMART TEXT -------------" + SMART.TEXT$
  184.       PRINT "18. File with automatic operator page parameters - " ; AUTOPAGE.DEF$
  185.       X = INSTR("ANS",LOGON.MAIL.LEVEL$)
  186.       IF X < 1 THEN _
  187.          X = 1
  188.       X$ = MID$("OLD & NEWNEW ONLY NONE",9*X-8,9)
  189.       IF X$ = "NONE" THEN _
  190.          X$ = "<none>"
  191.       PRINT "19. Personal mail notification level at logon is - " + X$
  192.       GOTO 12580
  193. 12370 DISPLAYED.PAGE.NUMBER = 2
  194.       GOSUB 24800
  195.       LOCATE  3,1
  196.       PRINT "21. Remind users of messages that they left ------ " + FNYESNO$(MESSAGE.REMINDER)
  197.       PRINT "22. Remind users of # uploads and downloads? ----- " + FNYESNO$(REMIND.FILE.TRANSFERS)
  198.       PRINT "23. Remind users of their terminal profile? ------ " + FNYESNO$(REMIND.PROFILE)
  199.       PRINT "24. Enable download of new files at logon -------- " + FNYESNO$(NEW.FILES.CHECK)
  200.       PRINT "25. Default user page length is ------------------" + STR$(PAGE.LENGTH)
  201.       PRINT "26. Maximum number of lines allowed per message --" + STR$(MAX.MESSAGE.LINES)
  202.       PRINT "27. Is system 'welcome' interruptable? ----------- " + FNYESNO$(WELCOME.INTERRUPTABLE)
  203.       PRINT "28. Are system bulletins to be 'optional'? ------- " + FNYESNO$(BULLETINS.OPTIONAL)
  204.       PRINT "29. Type of PC RBBS-PC will be running on? ------- " + COMPUTER.TYPE$
  205.       PRINT "30. Symbols to use for SYSOP commands ------------ " + SYSOP.COMMANDS$
  206.       PRINT "31. Symbols to use for MAIN menu commands -------- " + MAIN.COMMANDS$
  207.       PRINT "32. Symbols to use for FILE menu commands -------- " + FILE.COMMANDS$
  208.       PRINT "33. Symbols to use for UTILITIES menu commands --- " + UTIL.COMMANDS$
  209.       PRINT "34. Symbols to use for global commands ----------- " + GLOBAL.COMMANDS$
  210.       PRINT "35. Show section in command prompt --------------- " + FNYESNO$(SHOW.SECTION)
  211.       PRINT "36. Show commands in command prompt -------------- " + FNYESNO$(COMMANDS.IN.PROMPT)
  212.       PRINT "37. Restrict valid commands to current section --- " + FNYESNO$(RESTRICT.VALID.CMDS)
  213.       PRINT "38. Use machine language routines for speed ------ " + FNYESNO$(TURBO.RBBS)
  214.       PRINT "39. Use BASIC PRINT for screen writes ------------ " + FNYESNO$(USE.BASIC.WRITES)
  215.       PRINT "40. # of lines for extended file descriptions ----" + STR$(MAX.EXTENDED.LINES)
  216.       GOTO 12580
  217. 12380 DISPLAYED.PAGE.NUMBER = 3
  218.       GOSUB 24800
  219.       LOCATE  3,1
  220.       PRINT "41. Field used to identify users ----------------- " + HASH.ID$
  221.       PRINT "42. Field used to distinguish users with same ID-- " + INDIV.ID$
  222.       PRINT "43. Start position identifying personal downloads-"  + STR$(PERSONAL.BEGIN)
  223.       PRINT "44. Field length to identify personal downloads --"  + STR$(PERSONAL.LEN)
  224.       PRINT "45. Prompt for first part of personal identifier - " + FIRST.NAME.PROMPT$
  225.       PRINT "46. Prompt for last part of personal identifier -- " + LAST.NAME.PROMPT$
  226.       PRINT "47. Enforce upload/download ratios --------------- " + FNYESNO$(ENFORCE.UPLOAD.DOWNLOAD.RATIOS)
  227.       PRINT "48. RESTRICT users by SUBSCRIPTION date ---------- " + FNYESNO$(RESTRICT.BY.DATE)
  228.       PRINT "49. Security level when SUBSCRIPTION expires -----"  + STR$(EXPIRED.SECURITY)
  229.       PRINT "50. Days before expiration to warn callers -------"  + STR$(DAYS.TO.WARN)
  230.       PRINT "51. Default # days in SUBSCRIPTION PERIOD --------"  + STR$(DAYS.IN.SUBSCRIPTION.PERIOD)
  231.       PRINT "52. Turn printer off after each recycle ---------- " + FNYESNO$(TURN.PRINTER.OFF)
  232.       PRINT "53. Play musical themes for RBBS-PC functions----- " + FNYESNO$(MUSIC)
  233.       PRINT "54. BUFFER SIZE used when displaying text files --" + STR$(BUFFER.SIZE)
  234.       PRINT "55. Stack space to be made available -------------" + STR$(SIZE.OF.STACK)
  235.       PRINT "56. File shown users when SYSOP wants system next  " + NOT.YET.IN$ ' F7.MESSAGE$
  236.       PRINT "57. Ask users their (What is your ...) ----------- " + USER.LOCATION$
  237.       PRINT "58. Show ALL DIRECTORIES in order in dir of dir -- " + FNYESNO$(USE.DIR.ORDER)
  238.       PRINT "59. BUFFER SIZE for writes on internal protocols -" + STR$(WRITE.BUF.DEF)
  239.       PRINT "60. Voice Synthesizer support -------------------- " + VOICE.TYPE$
  240.       GOTO 12580
  241. 12390 DISPLAYED.PAGE.NUMBER = 4
  242.       GOSUB 24800
  243.       IF INSTR(DRIVE.FOR.BULLETINS$,":") < 1 THEN _
  244.          DRIVE.FOR.BULLETINS$ = DRIVE.FOR.BULLETINS$ + ":"
  245.       LOCATE  3,1
  246.       PRINT "61. Drive and file describing 'bulletins' is ----- " + DRIVE.FOR.BULLETINS$ + BULLETIN.MENU$
  247.       PRINT "62. Number of active 'bulletins' -----------------" + STR$(ACTIVE.BULLETINS)
  248.       PRINT "63. Prefix used to name bulletin files is -------- " + BULLETIN.PREFIX$
  249.       PRINT "64. Drive and path (optional) for 'help' files --- " + HELP.PATH$
  250.       PRINT "65. Prefix used to name three major 'help' files - " + HELP.FILE.PREFIX$
  251.       PRINT "66. Extension for help files of individual cmds -- " + HELP.EXTENSION$
  252.       PRINT "67. HELP file when callers CATEGORIZE uploads ---- " + UPCAT.HELP$
  253.       PRINT "68. Name of 'newuser' file shown to new users ---- " + NEWUSER.FILE$
  254.       PRINT "69. Name of 'welcome' file shown at logon -------- " + WELCOME.FILE$
  255.       PRINT "70. The SYSOP's command menu is named ------------ " + MENU$(1)
  256.       PRINT "71. The MAIN system menu is named ---------------- " + MENU$(2)
  257.       PRINT "72. The file subsystem menu is named ------------- " + MENU$(3)
  258.       PRINT "73. The utilities subsystem menu is named -------- " + MENU$(4)
  259.       PRINT "74. Menu that lists available conferences is ----- " + CONFERENCE.MENU$
  260.       PRINT "75. Menu that lists questionnaires available is -- " + ANS.MENU$
  261.       PRINT "76. Drive/path for optional questionnaires ------- " + QUES.PATH$
  262.       PRINT "77. File with main SYSOP-supplied user interface - " + MAIN.PUI$
  263.       PRINT "78. Allow menus to pause in the middle ----------- " + FNYESNO$(MENUS.CAN.PAUSE)
  264.       PRINT "79. Drive/path where macro files are stored ------ " + MACRO.DRVPATH$
  265.       PRINT "80. Extension of macro files --------------------- " + MACRO.EXTENSION$
  266.       GOTO 12580
  267. 12400 DISPLAYED.PAGE.NUMBER = 5
  268.       GOSUB 24800
  269.       LOCATE  3,1
  270.       PRINT " 81. File containing invalid user names ----------- " + TRASHCAN.FILE$
  271.       PRINT " 82. Name questionnaire required of ALL callers --- " + REQUIRED.QUESTIONNAIRE$
  272.       PRINT " 83. Name of 'pre-log' file ----------------------- " + PRELOG$
  273.       PRINT " 84. Name of questionnaire required of new users -- " + NEW.USER.QUESTIONNAIRE$
  274.       PRINT " 85. Name of 'epi-log' questionnaire -------------- " + EPILOG$
  275.       PRINT " 86. System file containing messages is named ----- " + MAIN.MESSAGE.FILE$
  276.       PRINT " 87. System file for recording users is named ----- " + MAIN.USER.FILE$
  277.       PRINT " 88. System file for comments to SYSOP is named --- " + COMMENTS.FILE$
  278.       PRINT " 89. Record comments as private messages ---------- " ; FNYESNO$(COMMENTS.AS.MESSAGES)
  279.       PRINT " 90. System file for 'callers' is named ----------- " + CALLERS.FILE$
  280.       PRINT " 91. Extended logging to 'callers' file ----------- " ; FNYESNO$(EXTENDED.LOGGING)
  281.       PRINT " 92. Wrap-around the 'callers' file --------------- " + NOT.YET.IN$ ' WRAP.CALLERS.FILE$
  282.       PRINT " 93. File controlling scan for mail waiting ------- " + CONFMAIL.LIST$
  283.       PRINT " 94. Max # of work variables in ques/macros -------"  ; STR$(MAX.WORK.VAR)
  284.       GOTO 12580
  285. 12410 DISPLAYED.PAGE.NUMBER = 6
  286.       GOSUB 24800
  287.       LOCATE  3,1
  288.       PRINT "101. Is the 'door' subystem available? ------------ " ; FNYESNO$(DOORS.AVAILABLE)
  289.       PRINT "102. The 'door' subsystem menu is named ----------- " + MENU$(5)
  290.       PRINT "103. File built dynamically to open a 'door' ------ " + RCTTY.BAT$
  291.       PRINT "104. When a 'door' closes, re-invoke RBBS-PC via -- " + RBBS.BAT$
  292.       PRINT "105. Drive/path to look for COMMAND.COM on -------- " + DISK.FOR.DOS$
  293.       PRINT "106. Use the Dos 'CTTY' command to redirect I/O --- " ; FNYESNO$(REDIRECT.IO.METHOD)
  294.       PRINT "107. Door Program to check users at logon --------- " ; REGISTRATION.PROGRAM$
  295.       PRINT "108. Logon door required of new users & security <="  ; STR$(MAX.REG.SEC)
  296.       PRINT "109. Name of control file for doors --------------- " ; DOORS.DEF$
  297.       GOTO 12580
  298. 12420 DISPLAYED.PAGE.NUMBER = 7
  299.       GOSUB 24800
  300.       LOCATE  3,1
  301.       PRINT "121. Pseudonym to sign on remotely as the SYSOP ---- " + MN1$+ " " +MN2$
  302.       PRINT "122. ESC key logs SYSOP on locally without password- " + FNYESNO$(ESCAPE.INSECURE)
  303.       PRINT "123. Minimum security level to log on RBBS-PC ------" + STR$(MINIMUM.LOGON.SECURITY)
  304.       PRINT "124. Default security level for new callers --------" + STR$(DEFAULT.SECURITY.LEVEL)
  305.       PRINT "125. Security level for SYSOP ----------------------" + STR$(SYSOP.SECURITY.LEVEL)
  306.       PRINT "126. Minimum security level to see SYSOP's menu ----" + STR$(SYSOP.MENU.SECURITY.LEVEL)
  307.       PRINT "127. Minimum security to leave extended description-" + STR$(ASK.EXTENDED.DESC)
  308.       PRINT "128. Max # security violations before disconnect ---" + STR$(MAXIMUM.VIOLATIONS)
  309.       M22$ = STR$(SYSOP.FUNCTION(1))
  310.       IX = SYSOP.FUNCTION(1)
  311.       FOR I = 2 TO NUM.SYSOP
  312.         IF IX <> SYSOP.FUNCTION(I) THEN _
  313.            M22$ = "(Variable)" : _
  314.            GOTO 12430
  315.       NEXT
  316. 12430 PRINT "129. Security level for SYSOP functions ------------" + M22$
  317.       M23$ = STR$(MAIN.FUNCTION(1))
  318.       IX = MAIN.FUNCTION(1)
  319.       FOR I = 2 TO NUM.MAIN
  320.         IF IX<>MAIN.FUNCTION(I) THEN _
  321.            M23$ = "(Variable)" : _
  322.            GOTO 12440
  323.       NEXT
  324. 12440 PRINT "130. Security level for main menu functions --------" + M23$
  325.       M24$ = STR$(FILES.FUNCTION(1))
  326.       IX = FILES.FUNCTION(1)
  327.       FOR I = 2 TO NUM.FILES
  328.         IF IX<>FILES.FUNCTION(I) THEN _
  329.            M24$ = "(Variable)" : _
  330.            GOTO 12450
  331.       NEXT
  332. 12450 PRINT "131. Security level for file menu functions --------" + M24$
  333.       M25$ = STR$(UTILITY.FUNCTION(1))
  334.       IX = UTILITY.FUNCTION(1)
  335.       FOR I = 2 TO NUM.UTILITY
  336.         IF IX<>UTILITY.FUNCTION(I) THEN _
  337.            M25$ = "(Variable)" : _
  338.            GOTO 12460
  339.       NEXT
  340. 12460 PRINT "132. Security level for utilities menu functions ---" + M25$
  341.       M26$ = STR$(GLOBAL.FUNCTION(1))
  342.       IX = GLOBAL.FUNCTION(1)
  343.       FOR I = 1 TO NUM.GLOBAL
  344.         IF IX<>GLOBAL.FUNCTION(I) THEN _
  345.            M26$ = "(Variable)" : _
  346.            GOTO 12465
  347.       NEXT
  348. 12465 PRINT "133. Security level for GLOBAL commands ------------" + M26$
  349.       PRINT "134. Max # of password changes in a session --------" + STR$(MAXIMUM.PASSWORD.CHANGES)
  350.       PRINT "135. Minimun security for temp. password changes ---" + STR$(MINIMUM.SECURITY.FOR.TEMP.PASSWORD)
  351.       PRINT "136. Minimum security to overwrite on uploads ------" + STR$(OVERWRITE.SECURITY.LEVEL)
  352.       PRINT "137. User's security exempted from 'packing' -------" + STR$(SEC.LVL.EXEMPT.FRM.PURGING)
  353.       PRINT "138. Default security to read new PRIVATE messages -"  + STR$(PRIVATE.READ.SEC)
  354.       PRINT "139. Default security to read new PUBLIC messages --"  + STR$(PUBLIC.READ.SEC)
  355.       PRINT "140. Minimum security to change msg.'s security ----"  + STR$(SEC.CHANGE.MSG)
  356.       GOTO 12580
  357. 12466 DISPLAYED.PAGE.NUMBER = 8
  358.       GOSUB 24800
  359.       LOCATE  3,1
  360.       PRINT "141. Call-back verification ----------------------- " + NOT.YET.IN$ ' CALLBACK.VERIFICATION$
  361.       PRINT "142. Drive/path where personal files & dir stored - " + PERSONAL.DRVPATH$
  362.       PRINT "143. Name of Personal Directory ------------------- " + PERSONAL.DIR$
  363.       PRINT "144. Protocol required for personal downloads ----- " + MID$("<none>  Ascii  XMODEM Xm/CRC Kermit Ymodem Imodem YmodemGWxmodem", 7 * INSTR("NAXCKYIGW",PERSONAL.PROTOCOL$) - 6,7)
  364.       PRINT "145. Files with download security are listed in --- " + FILESEC.FILE$
  365.       PRINT "146. File name with privileged group passwords is - " + PASSWORD.FILE$
  366.       PRINT "147. Concatenate multi-file ASCII downloads ------- " + FNYESNO$(PERSONAL.CONCAT)
  367.       PRINT "148. Min SECURITY to CATEGORIZE uploads -----------" + STR$(SL.CATEGORIZE.UPLOADS)
  368.       PRINT "149. Min security level to view new uploads -------" + STR$(MIN.SEC.TO.VIEW)
  369.       PRINT "150. Security level exempt from 'epi-log' file ----" + STR$(SECURITY.EXEMPT.FROM.EPILOG)
  370.       PRINT "151. Min. security to 'AUTO ADD' conference user --" + AUTO.ADD.SECURITY$
  371.       PRINT "152. Min. security for old caller to turbo logon --" + STR$(ALLOW.CALLER.TURBO)
  372.       PRINT "153. Min. security to describe an existing file ---" + STR$(ADD.DIR.SECURITY)
  373.       PRINT "154. Help file to display for a security violation- " + SECVIO.HLP$
  374.       TIME.LOCK$ = MID$("<none> DOORS  DOWNLDSBOTH   ",TIME.LOCK*7+1,7)
  375.       PRINT "155. Time lock on DOORS and DOWNLOADS ------------- "; TIME.LOCK$
  376.       PRINT "156. Min. sec level exempt from auto-update of sec-" ; AUTO.UPGRADE.SEC
  377.       PRINT "157. Min security to READ & KILL all messages -----" ; SEC.KILL.ANY
  378.       PRINT "158. Do not display messages beginning with ------- "; SCREEN.OUT.MSG$
  379.       GOTO 12580
  380. 12470 DISPLAYED.PAGE.NUMBER = 9
  381.       GOSUB 30040
  382.       ' MAX.USR.FILE.SIZE.FRM.DEF = HIGHEST.USER.RECORD
  383.       MAX.MSG.FILE.SIZE.FRM.DEF! = HIGHEST.MESSAGE.RECORD
  384.       MAX.ALLOWED.MSGS.FRM.DEF  = MAXIMUM.NUMBER.OF.MSGS
  385.       GOSUB 24800
  386.       LOCATE  3,1
  387.       PRINT "161. Maximum number of concurrent RBBS-PC's  -------" + STR$(MAXIMUM.NUMBER.OF.NODES)
  388.       MT$ = "single RBBS-PC copy "
  389.       IF MAXIMUM.NUMBER.OF.NODES <> 1 THEN _
  390.          MT$ = "concurrent RBBS-PC's" : _
  391.          SUBROUTINE.PARAMETER = 2 : _
  392.          IF NETWORK.TYPE < 0 OR NETWORK.TYPE > 7 THEN _
  393.             SUBROUTINE.PARAMETER = 1 : _
  394.             CALL NETTYPE : _
  395.          ELSE CALL NETTYPE
  396.       IF NETWORK.TYPE = 6 THEN _
  397.          MT$ = "NETBIOS             "
  398.       IF NETWORK.TYPE = 7 THEN _
  399.          MT$ = "DoubleDOS           "
  400.       PRINT "162. Environment running " + MT$ + " ------ " + NETWORK.TYPE$
  401.       PRINT "163. RBBS-PC 'recycle' method when users log off --- " + RECYCLE.TO.DOS$
  402.       FILE$ = MAIN.MESSAGE.FILE$
  403.       GOSUB 30180
  404.       MAX.MSG.FILE.SIZE.FRM.DEF! = UG
  405.       PRINT "164. Number of records in the User File ------------";STR$(MAX.USR.FILE.SIZE.FRM.DEF)
  406.       PRINT "165. Number of records in the Message File ---------";STRING$(20-LEN(MAIN.MESSAGE.FILE$),"-");STR$(MAX.MSG.FILE.SIZE.FRM.DEF!) ' KG052103
  407.       PRINT "166. Maximum number of messages allowed ------------" + STR$(MAX.ALLOWED.MSGS.FRM.DEF)
  408.       PRINT "167. Conference File Maintenance."
  409.       PRINT "168. Default extension for compressed files -------- " ; DEFAULT.EXTENSION$
  410.       PRINT "169. Message file GROWS in size as messages added -- " ; FNYESNO$(MESSAGES.CAN.GROW)
  411.       GOTO 12580
  412. 12480 DISPLAYED.PAGE.NUMBER = 10
  413.       GOSUB 24800
  414.       RB = 0
  415.       LOCATE  3,1
  416.       PRINT "181. Pack " + MAIN.MESSAGE.FILE$ + " file.
  417.       PRINT "182. Rebuild " + MAIN.USER.FILE$ + " file.
  418.       PRINT "183. Print " + MAIN.MESSAGE.FILE$ + " 'header' records.
  419.       PRINT "184. Renumber messages in " + MAIN.MESSAGE.FILE$ + " file.
  420.       PRINT "185. Repair messages in " + MAIN.MESSAGE.FILE$ + " file.
  421.       PRINT "186. Make all users answer required questionnaire."
  422.       PRINT "187. Check FMS directory structure."
  423.       PRINT "188. Check Personal Download directory structure."
  424.       PRINT "189. Set most critical parameters."
  425.       PRINT "190. Set parameters new to RBBS-PC " + CONFIG.VERSION$
  426.       PRINT "191. Reset active printers for all nodes."
  427.       PRINT "192. Make user pref. on hilighting match color graphics."
  428.       GOTO 12580
  429. 12490 DISPLAYED.PAGE.NUMBER = 11
  430.       GOSUB 24800
  431.       LOCATE  3,1
  432.       PRINT "201. Drive available for uploading files to ------- " + DRIVE.FOR.UPLOADS$ + ":"
  433.       PRINT "202. File name of Upload Directory  --------------- " + UPLOAD.DIRECTORY$
  434.       PRINT "203. Drive/path where Upload Directory stored ----- " + UPLOAD.PATH$
  435.       PRINT "204. Drive(s) available for Downloading ----------- " + DRIVES.FOR.DOWNLOADS$
  436.       PRINT "205. Will you be using DOS sub-directories? ------- " ; FNYESNO$(WILL.SUBDIRS.B.USED)
  437.       PRINT "206. Write Uploads to a DOS sub-directory? -------- " + FNYESNO$(UPLOAD.TO.SUBDIR)
  438.       PRINT "207. Are downloads from DOS sub-directories? ------ " + FNYESNO$(DOWNLOAD.TO.SUBDIR)
  439.       PRINT "208. List, change, add, delete sub-directories."
  440.       PRINT "209. Extension for file directories --------------- " + DIRECTORY.EXTENTION$
  441.       X$ = ALTDIR.EXTENSION$
  442.       IF ALTDIR.EXTENSION$ = "" OR _
  443.          ALTDIR.EXTENSION$ = "<none>" THEN _
  444.          X$ = NONE.PICKED$
  445.       PRINT "210. Alternate extension for directory files ------ " + X$
  446.       PRINT "211. Name (prefix) of directory of directories ---- " + DIRECTORY.PREFIX$
  447.       PRINT "212. Omit directory of directories in N)ew cmnd. -- " + OMIT.MAIN.DIRECTORY$
  448.       X$ = ALWAYS.STREW.TO$
  449.       IF ALWAYS.STREW.TO$ = "" OR _
  450.          ALWAYS.STREW.TO$ = "<none>" THEN _
  451.          X$ = "NO"
  452.       PRINT "213. Copy all upload descriptions to -------------- " + X$
  453.       A$ = FMS.DIRECTORY$
  454.       IF FMS.DIRECTORY$ = "" THEN _
  455.          A$ = NONE.PICKED$
  456.       PRINT "214. Name of master File Management System dir is - " + A$
  457.       PRINT "215. Limit file searches to master FMS dir only --- " ; FNYESNO$(LIMIT.SEARCH.TO.FMS)
  458.       PRINT "216. Default category code for uploads ------------ " + DEFAULT.CATEGORY.CODE$
  459.       PRINT "217. File containing valid directory categories --- " + DIR.CATEGORY.FILE$
  460.       X$ = MASTER.DIRECTORY.NAME$
  461.       IF MASTER.DIRECTORY.NAME$ = "" THEN _
  462.          X$ = "NO"
  463.       PRINT "218. Limit search for 'ALL' dirs to directory ----- " + X$
  464.       PRINT "219. Max length of description of uploaded file ---" + STR$(MAX.DESC.LEN)
  465.       PRINT "220. Drive/path(optional) for directory files ----- " + DIRECTORY.PATH$
  466.       GOTO 12580
  467. 12500 DISPLAYED.PAGE.NUMBER = 12
  468.       GOSUB 24800
  469.       LOCATE 3,1
  470.       PRINT "221. Communications port to be used by RBBS-PC ---- " + COM.PORT$
  471.       PRINT "222. # of seconds to wait for modem to initialize -" + STR$(MODEM.INIT.WAIT.TIME)
  472.       PRINT "223. Seconds to wait before issuing modem commands-" + STR$(MODEM.COMMAND.DELAY.TIME)
  473.       PRINT "224. Number of rings to wait before answering -----" + STR$(REQUIRED.RINGS);
  474.       IF INSTR(USER.INIT.COMMAND$, "S0=255 ") > 0 THEN _
  475.          PRINT " RING BACK";
  476.       PRINT "225. Use the RBBS-PC default Hayes commands? ------ " + M14$
  477.       PRINT "226. ---------------------------------------------- "
  478.       PRINT "227. Issue modem commands between rings ----------- " ; FNYESNO$(COMMANDS.BETWEEN.RINGS)
  479.       PRINT "228. Baud rate to initially open modem at --------- " + MODEM.INIT.BAUD$
  480.       X$ = STR$(WAIT.BEFORE.DISCONNECT) + " seconds"
  481.       IF WAIT.BEFORE.DISCONNECT = 0 THEN _
  482.          X$ = "NO"
  483.       PRINT "229. Log off user who are idle for ----------------" + X$
  484.       PRINT "230. Are you using a 'DUMB' auto-answer modem? ---- " ; FNYESNO$(DUMB.MODEM)
  485.       PRINT "231. Initialize modem firmware for RBBS-PC."
  486.       PRINT "232. # seconds to wait after dropping DTR ---------"  + STR$(DTR.DROP.DELAY)
  487.       PRINT "233. File with PROTOCOL definitions --------------- " + PROTO.DEF$
  488.       PRINT "234. Always check caller for AUTODOWNLOAD support - " ; FNYESNO$(ASK.IDENTITY)
  489.       PRINT "235. Require non-ascii protocol for BASIC files --- " ; FNYESNO$(REQUIRE.NON.ASCII)
  490.       X$ = STR$(RECYCLE.WAIT) + " minutes"
  491.       IF RECYCLE.WAIT = 0 THEN _
  492.          X$ = "<Don't recycle>"
  493.       PRINT "236. Recycle if no calls are received within ------" + X$
  494.       PRINT "237. Leave modem at initial baud ------------------ " + MID$("YES NO  HIGH",(4*KEEP.INIT.BAUD)+5,4) ' WM042201
  495.       GOTO 12580
  496. 12505 DISPLAYED.PAGE.NUMBER = 13
  497.       GOSUB 24800
  498.       LOCATE 3,1
  499.       PRINT "241. Restore initial parms. after change to N/8/1 - " + FNYESNO$(SWITCH.BACK)
  500.       PRINT "242. Minimum baud required of new callers ---------"  + STR$(MIN.NEWCALLER.BAUD)
  501.       PRINT "243. Minimum baud required of old callers ---------"  + STR$(MIN.OLDCALLER.BAUD)
  502.       PRINT "244. Modem flow control uses Clear-to-Send (CTS)--- " + RTS$
  503.       PRINT "245. Modem flow control uses XON/XOFF ------------- " + FNYESNO$(XON.XOFF)
  504.       PRINT "246. Seconds to wait for carrier after answering --"  + STR$(MAX.CARRIER.WAIT)
  505.       GOTO 12580
  506. 12510 DISPLAYED.PAGE.NUMBER = 14
  507.       GOSUB 24800
  508.       LOCATE 3,1
  509.       TIME.TO.DROP.TO.DOS$ = "<none>"
  510.       IF TIME.TO.DROP.TO.DOS > 0 THEN _
  511.          TIME.TO.DROP.TO.DOS$ = STRING$(4 - (LEN(STR$(TIME.TO.DROP.TO.DOS)) - 1),"0") + MID$(STR$(TIME.TO.DROP.TO.DOS),2)
  512. 12512 PRINT "261. Time of day to exit to DOS ------------------- " + TIME.TO.DROP.TO.DOS$
  513.       PRINT "262. Net mail to invoke is ------------------------ " + NET.MAIL$
  514.       X$ = HOST.ECHO.ON$
  515.       IF HOST.ECHO.ON$ = "" THEN _
  516.          X$ = NONE.PICKED$
  517.       PRINT "263. Command for intermediate host to ECHO -------- " + X$
  518.       X$ = HOST.ECHO.OFF$
  519.       IF HOST.ECHO.OFF$ = "" THEN _
  520.          X$ = NONE.PICKED$
  521.       PRINT "264. Command for intermediate host NOT to ECHO ---- " + X$
  522.       X = INSTR("ICR",DEFAULT.ECHOER$)
  523.       X$ = MID$("Intermediate hostCaller's softwareRBBS-PC",1 + 17 * (X - 1),17)
  524.       PRINT "265. Who echos what a remote caller types? -------- " + X$
  525.       X$ = DEFAULT.LINE.ACK$
  526.       IF DEFAULT.LINE.ACK$ = "" THEN _
  527.          X$ = NONE.PICKED$
  528.       PRINT "266. String to acknowlege line in ASCII upload ---- "+ X$
  529.       GOTO 12580
  530. 12520 DISPLAYED.PAGE.NUMBER = 15
  531.       GOSUB 24800
  532.       LOCATE  3,1
  533.       PRINT "281. Let new users set their preferences --------- " ; FNYESNO$(NEWUSER.SETS.DEFAULTS)
  534.       PRINT "282. New users default sign-on mode -------------- " + NOT.YET.IN$ ' NEW.USER.DEFAULT.MODE$
  535.       PRINT "283. New users default file-transfer protocol ---- " + NOT.YET.IN$ ' NEW.USER.DEFAULT.PROTOCOL$
  536.       PRINT "284. Line feeds for new users default to --------- " + NOT.YET.IN$ ' NEW.USER.LINE.FEEDS$
  537.       PRINT "285. DRIVE AND PATH FOR Viewarc Utility.(eg PKZIP) " + ARKVIEW.PATH$ 'VIEWARC MOD
  538.       PRINT "286. Prompt bell for new users defaults to ------- " + NOT.YET.IN$ ' NEW.USER.BELL$
  539.       PRINT "287. New users 'graphics' capability is assumed -- " + NOT.YET.IN$ ' NEW.USER.GRAPHICS$
  540.       PRINT "288. New users are assumed UPPERCASE only -------- " + NOT.YET.IN$ ' NEW.USER.CASE$
  541.       PRINT "289. New users message margins defaults to ------- " + NOT.YET.IN$ ' STR$(NEW.USER.MARGINS)
  542.       PRINT "290. Add new users to USERS file ----------------- " ; FNYESNO$(REMEMBER.NEW.USERS)
  543.       PRINT "291. Let new users on even when USERS file full -- " ; FNYESNO$(SURVIVE.NOUSER.ROOM)
  544.       GOTO 12580
  545. 12530 DISPLAYED.PAGE.NUMBER = 16
  546.       GOSUB 24800
  547.       LOCATE  3,1
  548.       X$ = LIBRARY.DRIVE$
  549.       IF LIBRARY.DRIVE$ = "" THEN _
  550.          X$ = NONE.PICKED$
  551.       PRINT "301. Library drive ------------------------------- " + X$
  552.       PRINT "302. Drive/Path for Library directory ------------ " + LIBRARY.DIRECTORY.PATH$
  553.       PRINT "303. Extension for Library directory ------------- " + LIBRARY.DIRECTORY.EXTENTION$
  554.       PRINT "304. Drive/Path for Library work/RAM disk -------- " + LIBRARY.WORK.DISK.PATH$
  555.       PRINT "305. # of disks in Library -----------------------" + STR$(LIBRARY.MAX.DISK)
  556.       PRINT "306. # of master Library subdirectories ----------" + STR$(LIBRARY.MAX.DIRECTORY)
  557.       PRINT "307. # of subdirectories in each master ----------" + STR$(LIBRARY.MAX.SUBDIR)
  558.       PRINT "308. Prefix of Library subdirectories ------------ " + LIBRARY.SUBDIR.PREFIX$
  559.       PRINT "309. Name of Library subsystem command menu ------ " + MENU$(6)
  560.       PRINT "310. Symbols to use for Library menu commands ---- " + LIBRARY.COMMANDS$
  561.       M27$ = STR$(PS)
  562.       IX = LIBRARY.FUNCTION(1)
  563.       FOR I = 1 TO NUM.LIBRARY
  564.          IF IX<>LIBRARY.FUNCTION(I) THEN _
  565.             M27$ = "(Variable)" : _
  566.             GOTO 12531
  567.       NEXT
  568. 12531 PRINT "311. Security level for Library menu functions --- " + M27$
  569.       PRINT "312. Drive/Path of archive utility --------------- " + LIBRARY.ARCHIVE.PATH$
  570.       PRINT "313. Name of executable archive utility ---------- " + LIBRARY.ARCHIVE.PROGRAM$
  571.       GOTO 12580
  572. 12540 DISPLAYED.PAGE.NUMBER = 17
  573.       GOSUB 24800
  574.       LOCATE  3,1
  575.       X$ = EMPHASIZE.ON.DEF$
  576.       IF EMPHASIZE.ON.DEF$ = "" THEN _
  577.          X$ = NONE.PICKED$
  578.       PRINT "321. String to turn ON Graphic Emphasis ----------- " + X$
  579.       X$ = EMPHASIZE.OFF.DEF$
  580.       IF EMPHASIZE.OFF.DEF$ = "" THEN _
  581.          X$ = NONE.PICKED$
  582.       PRINT "322. String to restore normal text (Emphasis OFF) - " + X$
  583.       PRINT "323. Caller's Foreground color 1 ------------------ " + FG.1.DEF$
  584.       PRINT "324. Caller's Foreground color 2 ------------------ " + FG.2.DEF$
  585.       PRINT "325. Caller's Foreground color 3 ------------------ " + FG.3.DEF$
  586.       PRINT "326. Caller's Foreground color 4 ------------------ " + FG.4.DEF$
  587.       X$ = MID$("<none>Blue  Green Cyan  Red   PurpleYellowWhite",CALLER.BKGRD*6+1,6)
  588.       PRINT "327. Caller's Background color -------------------- " ; X$
  589.       GOTO 12580
  590. 12550 DISPLAYED.PAGE.NUMBER = 18
  591.       GOSUB 24800
  592.       GOTO 12580
  593. 12580 IF PRE.DISPLAY THEN _
  594.          PRE.DISPLAY = FALSE : _
  595.          GOTO 12622
  596.       GOSUB 24890
  597. 12590 GOSUB 22160
  598. 12592 IF IX THEN _            'IX       Key    Where to branch to
  599.          ON IX GOTO 12360, _  ' 1       F1 - Global Parameters (Part 1)
  600.                     12370, _  ' 2       F2 - Global Parameters (Part 2)
  601.                     12380, _  ' 3       F3 - Global Parameters (Part 3)
  602.                     12390, _  ' 4       F4 - RBBS-PC System Files (Part 1)
  603.                     12400, _  ' 5       F5 - RBBS-PC System Files (Part 2)
  604.                     12410, _  ' 6       F6 - RBBS-PC "doors"
  605.                     12420, _  ' 7       F7 - RBBS-PC security parms. (Part 1)
  606.                     12466, _  ' 8       F8 - RBBS-PC security parms. (Part 2)
  607.                     12470, _  ' 9       F9 - Multiple RBBS-PC parameters
  608.                     12480, _  '10      F10 - RBBS-PC's utilities
  609.                     12490, _  '11 Shift-F1 - RBBS-PC File Manager
  610.                     12500, _  '12 Shift-F2 - RBBS-PC comm. parameters (Part 1)
  611.                     12505, _  '13 Shift-F3 - RBBS-PC comm. parameters (Part 2)
  612.                     12510, _  '14 Shift-F4 - RBBS-PC Net Mail
  613.                     12520, _  '15 Shift-F5 - New user parameters
  614.                     12530, _  '16 Shift-F6 - Library parameters
  615.                     12540, _  '17 Shift-F7 - RBBS-PC Color parameters
  616.                     12310, _  '18 Shift-F8 - Reserved for future use
  617.                     12340, _  '19     PgUp - Go to previous page
  618.                     12330, _  '20     PgDn - Go to next page
  619.                     12630, _  '21      End - Terminate CONFIG
  620.                     12620     '22 Enter - Option selected followed by "enter"
  621.       GOTO 12590
  622. 12620 GOSUB 50340
  623.       IF VAL(HJ$) < 1 OR VAL(HJ$) > 331 THEN _
  624.          GOTO 12580
  625.       IPAGE = INT((VAL(HJ$) - 1) / 20)
  626.       IF DISPLAYED.PAGE.NUMBER <> IPAGE+1 THEN _
  627.          PRE.DISPLAY = TRUE : _
  628.          IX = IPAGE+1 : _
  629.          GOTO 12592
  630. 12622 ILOOKUP = VAL(HJ$) - (20 * IPAGE)
  631.       IPAGE = IPAGE + 1
  632.       IF ILOOKUP < 1 THEN _
  633.          ILOOKUP = 20 : _
  634.          IPAGE = IPAGE - 1
  635. 12630 EXIT SUB
  636. '
  637. ' * COMMON SUBROUTINE TO HANDLE THE FUNCTION KEYS, SCROLL BETWEEN CONFIG'S
  638. ' * PAGES OF OPTIONS, AND USER'S SELECTING A NUMERIC 4-CHARACTER OPTION.
  639. '
  640. 22160 I! = FRE(C$)
  641.       IX = 0
  642.       IF KSTACKED$ = "" THEN _
  643.          GOTO 22161
  644.       X = INSTR(KSTACKED$,CHR$(13))
  645.       IF X > 0 THEN _
  646.          IX = 22 : _
  647.          HJ$ = LEFT$(KSTACKED$,X-1) : _
  648.          KSTACKED$ = RIGHT$(KSTACKED$,LEN(KSTACKED$)-X) : _
  649.          OPTION$ = HJ$ : _
  650.          RETURN
  651.       Y$ = CHR$(0) + CHR$(68)
  652.       IF KSTACKED$ = "END" THEN _
  653.          Y$ = CHR$(0) + CHR$(79)
  654.       KSTACKED$ = ""
  655.       GOTO 22240
  656. 22161 Y$ = INKEY$
  657.       IF LEN(Y$) < 1 THEN _
  658.          GOTO 22161
  659.       IF LEN(Y$) = 2 THEN _               ' IF A FUNCTION KEY, BRANCH
  660.          GOTO 22240
  661.       IF ASC(Y$) = 13 THEN _              ' IF A CARRIAGE RETURN, RETURN
  662.          IX = 22 : _
  663.          RETURN
  664.       IF ASC(Y$) = 8 AND LEN(HJ$) > 0 THEN _
  665.          HJ$ = LEFT$(HJ$,LEN(HJ$) - 1) : _
  666.          PRINT CHR$(29) + " " + CHR$(29); : _
  667.          GOTO 22161
  668.       IF ASC(Y$) < 48 OR ASC(Y$) > 57 THEN _
  669.          GOTO 22161
  670.       PRINT Y$;
  671.       HJ$ = HJ$ + _
  672.             Y$
  673.       OPTION$ = HJ$
  674.       IF LEN(HJ$) > 4 THEN _              ' IF MORE THAN FOUR CHARACTERS,
  675.          IX = 22                          ' RETURN
  676.       RETURN
  677. '
  678. ' * COMMON SUBROUTINE TO HANDLE SET UP RETURN CODES FOR FUNCTION KEYS THAT
  679. ' * WERE PRESSED ON THE LOCAL PC RUNNING CONFIG
  680. '
  681. 22240 IX = ASC(RIGHT$(Y$,1))
  682.       IF IX < 59 OR IX > 91 THEN _        ' IGNORE IF NOT F1 THROUGH F10 OR
  683.          IX = 0: _                        ' SHIFT-F1 THROUGH SHIFT-F8
  684.          RETURN
  685.       IF IX = 73 THEN _                   ' IF PGUP THEN SET IX = 19
  686.          IX = 19 : _
  687.          RETURN
  688.       IF IX = 79 THEN _                   ' IF END THEN SET IX = 21
  689.          IX = 21 : _
  690.          RETURN
  691.       IF IX = 81 THEN _                   ' IF PGDN THEN SET IX = 20
  692.          IX = 20 : _
  693.          RETURN
  694.       IF (IX-58) < 11 THEN _              ' IF F1 THROUGH F10 SET IX = 1
  695.          IX = IX - 58 : _                 ' THROUGH 10 ACCORDINGLY.
  696.          RETURN
  697.       IF (IX-73) > 10 AND _               ' IF SHIFT-F1 THROUGH SHIFT-F8 THEN
  698.          (IX-73) < 19 THEN _              ' SET IX = 11 THROUGH 18
  699.             IX = IX - 73 : _              ' ACCORDINGLY.
  700.             RETURN
  701.       IX = 0
  702.       RETURN
  703. '
  704. ' * ROUTINE TO DISPLAY THE PAGE HEADER FOR CONFIG'S DISPLAYS
  705. '
  706. 24800 CLS
  707.       I! = FRE(C$)
  708.       COLOR 0,7,0
  709.       LOCATE 1,10
  710.       PRINT "RBBS-PC " + CONFIG.VERSION$ + " Configuration ";
  711.       IF CONFERENCE.MODE THEN _
  712.          GOSUB 24970
  713.       COLOR FG,BG,BORDER
  714.       PRINT " Page" + STR$(DISPLAYED.PAGE.NUMBER) + " of" + STR$(MAXIMUM.DISPLAYABLE.PAGES)
  715.       RETURN
  716. 24890 A$ = "Enter parameter # to change, END to update, PgUp/PgDn to scroll:"
  717. 24900 LOCATE 24,5
  718.       PRINT A$;
  719.       X = POS(0) + 2
  720.       PRINT STRING$((75 - LEN(A$)),32);
  721.       LOCATE 24,X
  722.       COLOR FG,BG,BORDER
  723.       HJ$ = "
  724.       I! = FRE(C$)
  725.       RETURN
  726. '
  727. ' * ROUTINE TO DISPLAY CONFERENCE MAINTENANCE MODE IN CONFIG'S DISPLAYS
  728. '
  729. 24970 LOCATE 2,1
  730.       PRINT SPACE$(10)
  731.       LOCATE 2,10
  732.       A$ = "Private"
  733.       IF CONFERENCE.MODE = 2 THEN _
  734.          A$ = "Public"
  735.       PRINT "(" + A$ + " Conference Maintenance Mode for " + _
  736.             MID$(MAIN.MESSAGE.FILE$,1,INSTR(MAIN.MESSAGE.FILE$,"M.DEF")-1) + _
  737.             ")";
  738.       RETURN
  739. '
  740. ' * COMMON SUBROUTINE TO READ THE MESSAGES FILE'S CHECKPOINT RECORD
  741. '
  742. 30040 IF NETWORK.TYPE = 6 THEN _
  743.          OPEN MAIN.MESSAGE.FILE$ FOR RANDOM SHARED AS #2 LEN=128 _
  744.       ELSE OPEN "R",2,MAIN.MESSAGE.FILE$,128
  745.       FIELD 2,128 AS RR$
  746.       GET 2,1
  747.       CALLS.TODATE! = VAL(MID$(RR$,1,8))             '  1-  8  =  number of last message on system
  748.       FIRST.USER.RECORD = VAL(MID$(RR$,52,5))        ' 52- 56  =  first rec. of user file
  749.       CURRENT.USER.COUNT = VAL(MID$(RR$,57,5))       ' 57- 61  =  next avail. user record
  750.       HIGHEST.USER.RECORD = VAL(MID$(RR$,62,5))      ' 62- 66  =  last rec. of user file
  751.       FIRST.MESSAGE.RECORD = VAL(MID$(RR$,68,7))     ' 68- 74 = first rec. of msgs file
  752.       NEXT.MESSAGE.RECORD = VAL(MID$(RR$,75,7))      ' 75- 81 = next avail. msgs record
  753.       HIGHEST.MESSAGE.RECORD = VAL(MID$(RR$,82,7))   ' 82- 88 = last rec. of msgs file
  754.       MAXIMUM.NUMBER.OF.MSGS = VAL(MID$(RR$,89,7))   ' 89- 95 = maximum number of messages
  755.       MAXIMUM.NUMBER.OF.NODES = VAL(MID$(RR$,127,2)) '127-128 = maximum number of "nodes"
  756.       CLOSE 2
  757.       RETURN
  758. '
  759. ' * COMMON ROUTINE TO GET THE LENGTH OF A FILE
  760. '
  761. 30180 IF NETWORK.TYPE = 6 THEN _
  762.          OPEN FILE$ FOR RANDOM SHARED AS #2 LEN=128 _
  763.       ELSE OPEN "R",2,FILE$,128
  764.       FIELD 2,128 AS RR$
  765.       UG = LOF(2) / 128
  766.       CLOSE 2
  767.       RETURN
  768. '
  769. ' * COMMON SUBROUTINE TO KEEP STRING SPACE CLEAN AND CLEAR LINE 24
  770. '
  771. 50340 I! = FRE(C$)
  772.       LOCATE 24,1
  773.       PRINT STRING$(79,32);
  774.       RETURN
  775. '
  776. ' * COMMON SUBROUTINE TO DISPLAY A MESSAGE ON LINE 24
  777. '
  778. 50345 GOSUB 50340
  779.       LOCATE 24,5
  780.       PRINT XX$;
  781.       RETURN
  782. '
  783. ' * COMMON SUBROUTINE TO BEEP AT THE SYSOP
  784. '
  785. 60380 FOR I = 1 TO 3
  786.         BEEP
  787.       NEXT
  788.       RETURN
  789.       END SUB
  790. '  $SUBTITLE: 'NETTYPE - subroutine to select supported networks'
  791. '  $PAGE
  792. '
  793. '  SUBROUTINE NAME    --  NETTYPE
  794. '
  795. '  INPUT PARAMETERS   --  MLCOM
  796. '                         NETWORK.TYPE
  797. '                         NETWORK.TYPE$
  798. '                         SUBROUTINE.PARAMETER
  799. '
  800. '  OUTPUT PARAMETERS  --  MLCOM
  801. '                         NETWORK.TYPE
  802. '                         NETWORK.TYPE$
  803. '
  804. '  SUBROUTINE PURPOSE --  TO SELECT THE RBBS-PC SUPPORTED NETWORKS
  805. '
  806.       SUB NETTYPE STATIC
  807.       ON SUBROUTINE.PARAMETER GOTO 60382,60384
  808. 60382 CLS
  809.       LOCATE 3,1
  810.       PRINT "     RBBS-PC is supported in the following:"
  811.       PRINT "                   Environment"
  812.       PRINT "          0. Single RBBS-PC in an IBM DOS environment"
  813.       PRINT "          1. MultiLink (multi-tasking under single DOS)"
  814.       PRINT "          2. Omninet (CORVUS)"
  815.       PRINT "          3. PC-NET (Orchid)"
  816.       PRINT "          4. DESQview (Quarterdeck)"
  817.       PRINT "          5. 10 NET (Fox Research)"
  818.       PRINT "          6. NETBIOS (DOS SHARE)"
  819.       PRINT "          7. DoubleDOS, but file sharing not supported."
  820. 60383 XX$ = "Select environment (0 to 7, [ENTER] quits)"
  821.       I! = FRE(C$)
  822.       LOCATE 24,1
  823.       PRINT STRING$(79,32);
  824.       LOCATE 24,5
  825.       PRINT XX$;
  826.       LINE INPUT;X$
  827.       IF X$ = "" THEN _
  828.          EXIT SUB
  829.       NETWORK.TYPE = VAL(X$)
  830.       IF NETWORK.TYPE < 0 OR NETWORK.TYPE > 7 THEN _
  831.          GOTO 60383
  832. 60384 IF NETWORK.TYPE = 0 THEN _
  833.          NETWORK.TYPE$ = "IBM's DOS"
  834.       IF NETWORK.TYPE = 1 THEN _
  835.          MLCOM = TRUE : _
  836.          NETWORK.TYPE$ = "MultiLink"
  837.       IF NETWORK.TYPE = 2 THEN _
  838.          NETWORK.TYPE$ = "Omninet"
  839.       IF NETWORK.TYPE = 3 THEN _
  840.          NETWORK.TYPE$ = "PC-NET"
  841.       IF NETWORK.TYPE = 4 THEN _
  842.          NETWORK.TYPE$ = "DESQview"
  843.       IF NETWORK.TYPE = 5 THEN _
  844.          NETWORK.TYPE$ = "10 NET"
  845.       IF NETWORK.TYPE = 6 THEN _
  846.          NETWORK.TYPE$ = "NETBIOS"
  847.       IF NETWORK.TYPE = 7 THEN _
  848.          NETWORK.TYPE$ = "No file sharing!"
  849.       IF SUBROUTINE.PARAMETER = 2 THEN _
  850.          EXIT SUB
  851.       IF NETWORK.TYPE = 2 OR NETWORK.TYPE = 3 OR NETWORK.TYPE = 5 OR NETWORK.TYPE = 6 THEN _
  852.          CALL GETNUMYN ("Are you running Multi-Link with " + NETWORK.TYPE$,MLCOM)
  853.       END SUB
  854. '  $SUBTITLE: 'CNFGINIT - subroutine to initialize CONFIG's constants'
  855. '  $PAGE
  856. '
  857. '  SUBROUTINE NAME    --  CNFGINIT
  858. '
  859. '  INPUT PARAMETERS   --  NONE
  860. '
  861. '  OUTPUT PARAMETERS  --  CONFIG'S CONSTANTS INITIALIZED
  862. '
  863. '  SUBROUTINE PURPOSE --  TO INITIALIZE THE CONSTANTS USED BY CONFIG
  864. '
  865. 60385 SUB CNFGINIT STATIC
  866. '
  867. ' * INITALIZE ALL VARIABLES IF A .DEF FILE DOESN'T AREADY EXIST
  868. '
  869.       D$ = DD$
  870.       DRV$ = LEFT$(D$,1)
  871.       FALSE                      = 0
  872.       TRUE                       = NOT FALSE
  873.       SYSOP.SECURITY.LEVEL       = 10
  874.       ACT.MNTHS.B4.DELETING      = 1
  875.       ACTIVE.BULLETINS           = 6
  876.       ADD.DIR.SECURITY           = SYSOP.SECURITY.LEVEL
  877.       ALLOW.CALLER.TURBO         = 6
  878.       ALTDIR.EXTENSION$          = ""
  879.       ALWAYS.STREW.TO$           = ""
  880.       ANS.MENU$                  = D$ + "MENUA"
  881.       ASK.EXTENDED.DESC          = SYSOP.SECURITY.LEVEL
  882.       ASK.IDENTITY               = FALSE
  883.       AUTO.ADD.SECURITY          = 5
  884.       AUTO.UPGRADE.SEC           = SYSOP.SECURITY.LEVEL
  885.       AUTOPAGE.DEF$              = D$ + "AUTOPAGE.DEF"
  886.       BG                         = 0
  887.       BORDER                     = 0
  888.       BUFFER.SIZE                = 128
  889.       BULLETIN.MENU$             = "BULLET"
  890.       BULLETIN.PREFIX$           = "BULLET"
  891.       BULLETINS.OPTIONAL         = TRUE
  892.       C$                         = ""
  893.       CALLER.BKGRD               = 0
  894.       CALLERS.FILE$              = D$ + "CALLERS"
  895.       SEC.KILL.ANY               = SYSOP.SECURITY.LEVEL
  896.       COM.PORT$                  = "COM1"
  897.       COMMANDS.BETWEEN.RINGS     = FALSE
  898.       COMMANDS.IN.PROMPT         = TRUE
  899.       COMMENTS.AS.MESSAGES       = FALSE
  900.       COMMENTS.FILE$             = D$ + "COMMENTS"
  901.       COMPUTER.TYPE              = 0
  902.       CONFERENCE.MENU$           = D$ + "CONFENCE"
  903.       CONFERENCE.VIEWER.SEC.LVL  = 0
  904.       CONFMAIL.LIST$             = D$ + "CONFMAIL.DEF"
  905.       CONFIG.VERSION$            = "(Version CPC17.2A)"
  906.       DEFAULT.CATEGORY.CODE$     = "UC "
  907.       DEFAULT.EXTENSION$         = "ZIP"
  908.       DAYS.IN.SUBSCRIPTION.PERIOD = 365
  909.       DAYS.TO.WARN               = 60
  910.       DIR.CATEGORY.FILE$         = D$ + "DIR.CAT"
  911.       DIRECTORY.PREFIX$          = "DIR"
  912.       DEFAULT.ECHOER$            = "R"
  913.       DEFAULT.LINE.ACK$          = ""
  914.       DEFAULT.SECURITY.LEVEL     = 5
  915.       DIRECTORY.EXTENTION$       = "DIR"
  916.       DIRECTORY.PATH$            = D$
  917.       DISK.FOR.DOS$              = D$
  918.       DISKFULL.GO.OFFLINE        = TRUE
  919.       DNLD.SUB                   = 0
  920.       DOORS.AVAILABLE            = FALSE
  921.       DOORS.DEF$                 = D$ + "DOORS.DEF"
  922.       DOORS.TERMINAL.TYPE        = 8
  923.       DOSANSI                    = FALSE
  924.       DOS.VERSION                = 2
  925.       DOWNLOAD.DRIVES$           = DRV$ + DRV$
  926.       DOWNLOAD.TO.SUBDIR         = FALSE
  927.       DRIVE.FOR.BULLETINS$       = D$
  928.       DRIVE.FOR.HELP.FILES$      = D$
  929.       DTR.DROP.DELAY             = 3
  930.       DUMB.MODEM                 = FALSE
  931.       ECHOER$                    = "R"
  932.       EMPHASIZE.OFF.DEF$         = "[27]" + "[0;40;33m"
  933.       EMPHASIZE.ON.DEF$          = "[27]" + "[1;41;37m"
  934.       END.OFFICE.HOURS           = 2200
  935.       ENFORCE.UPLOAD.DOWNLOAD.RATIOS = FALSE
  936.       EPILOG$                    = D$ + "EPILOG.DEF"
  937.       ESCAPE.INSECURE            = FALSE
  938.       EXPERT.USER                = 0
  939.       EXPIRED.SECURITY           = DEFAULT.SECURITY.LEVEL
  940.       EXTENDED.LOGGING           = FALSE
  941.       FC                         = 5
  942.       FG                         = 7
  943.       FG.1.DEF$                  = "Bright Green"
  944.       FG.2.DEF$                  = "Bright Yellow"
  945.       FG.3.DEF$                  = "Bright Purple"
  946.       FG.4.DEF$                  = "Bright Cyan"
  947.       FILE.COMMANDS.DEFAULTS$    = "DGLNPSUV"
  948.       FILE.COMMANDS$             = FILE.COMMANDS.DEFAULTS$
  949.       FILE.NOTIFY                = FALSE
  950.       FILES.FUNCTION$(1,1)       = "D)ownload a file      "
  951.       FILES.FUNCTION$(2,1)       = "G)oodbye              "
  952.       FILES.FUNCTION$(3,1)       = "L)ist file directory  "
  953.       FILES.FUNCTION$(4,1)       = "N)ew file search      "
  954.       FILES.FUNCTION$(5,1)       = "P)ersonal files       "
  955.       FILES.FUNCTION$(6,1)       = "S)earch files         "
  956.       FILES.FUNCTION$(7,1)       = "U)pload a file        "
  957.       FILES.FUNCTION$(8,1)       = "V)erbose ARC list     "
  958.       FILES.FUNCTION$(1,2)       = "D"
  959.       FILES.FUNCTION$(2,2)       = "G"
  960.       FILES.FUNCTION$(3,2)       = "L"
  961.       FILES.FUNCTION$(4,2)       = "N"
  962.       FILES.FUNCTION$(5,2)       = "P"
  963.       FILES.FUNCTION$(6,2)       = "S"
  964.       FILES.FUNCTION$(7,2)       = "U"
  965.       FILES.FUNCTION$(8,2)       = "V"
  966.       FILESEC.FILE$              = D$ + "FILESEC"
  967.       FIRST.NAME.PROMPT$         = "FIRST name"
  968.       FOSSIL                     = 0
  969.       GB                         = FC
  970.       GLOBAL.COMMANDS.DEFAULTS$  = "H?QX"
  971.       GLOBAL.COMMANDS$           = GLOBAL.COMMANDS.DEFAULTS$
  972.       GLOBAL.FUNCTION$(1,1)      = "H)elp on-line           "
  973.       GLOBAL.FUNCTION$(2,1)      = "?)help on-line (=H)     "
  974.       GLOBAL.FUNCTION$(3,1)      = "Q)uit this part         "
  975.       GLOBAL.FUNCTION$(4,1)      = "X)Expert toggle on/off  "
  976.       GLOBAL.FUNCTION$(1,2)      = "H"
  977.       GLOBAL.FUNCTION$(2,2)      = "?"
  978.       GLOBAL.FUNCTION$(3,2)      = "Q"
  979.       GLOBAL.FUNCTION$(4,2)      = "X"
  980.       GO.TO.SHELL                = TRUE
  981.       HELP$(3)                   = "HELP03"
  982.       HELP$(4)                   = "HELP04"
  983.       HELP$(7)                   = "HELP07"
  984.       HELP$(9)                   = "HELP09"
  985.       HELP.EXTENSION$            = "HLP"
  986.       HELP.FILE.PREFIX$          = "HELP0"
  987.       HELP.PATH$                 = D$
  988.       HOST.ECHO.OFF$             = ""
  989.       HOST.ECHO.ON$              = ""
  990.       IB                         = 0
  991.       KEEP.INIT.BAUD             = FALSE
  992.       KEEP.TIME.CREDITS          = FALSE
  993.       LAST.NAME.PROMPT$          = "LAST name"
  994.       LEN.HASH                   = 31
  995.       LEN.INDIV                  = 0
  996.       LIBRARY.ARCHIVE.PATH$        = D$
  997.       LIBRARY.ARCHIVE.PROGRAM$     = "ARCA "
  998.       LIBRARY.COMMANDS.DEFAULTS$   = "ACDGLSV"
  999.       LIBRARY.COMMANDS$            = LIBRARY.COMMANDS.DEFAULTS$
  1000.       LIBRARY.DRIVE$               = ""
  1001.       LIBRARY.MAX.DISK             = 705
  1002.       LIBRARY.MAX.DIRECTORY        = 7
  1003.       LIBRARY.MAX.SUBDIR           = 100
  1004.       LIBRARY.SUBDIR.PREFIX$       = "DISK"
  1005.       LIBRARY.DIRECTORY.PATH$      = D$
  1006.       LIBRARY.DIRECTORY.EXTENTION$ = "CDR"
  1007.       LIBRARY.FUNCTION$(1,1)       = "A)rchive a Library disk  "
  1008.       LIBRARY.FUNCTION$(2,1)       = "C)hange Library disk     "
  1009.       LIBRARY.FUNCTION$(3,1)       = "D)ownload a file         "
  1010.       LIBRARY.FUNCTION$(4,1)       = "G)oodbye                 "
  1011.       LIBRARY.FUNCTION$(5,1)       = "L)ist a file directory   "
  1012.       LIBRARY.FUNCTION$(6,1)       = "S)earch files            "
  1013.       LIBRARY.FUNCTION$(7,1)       = "V)erbose ARC list        "
  1014.       LIBRARY.FUNCTION$(1,2)       = "A"
  1015.       LIBRARY.FUNCTION$(2,2)       = "C"
  1016.       LIBRARY.FUNCTION$(3,2)       = "D"
  1017.       LIBRARY.FUNCTION$(4,2)       = "G"
  1018.       LIBRARY.FUNCTION$(5,2)       = "L"
  1019.       LIBRARY.FUNCTION$(6,2)       = "S"
  1020.       LIBRARY.FUNCTION$(7,2)       = "V"
  1021.       LIBRARY.WORK.DISK.PATH$      = D$
  1022.       LIMIT.SEARCH.TO.FMS        = FALSE
  1023.       LOGON.MAIL.LEVEL$          = "A"
  1024.       LSB                        = 1016
  1025. 60390 MACRO.DRVPATH$             = D$
  1026.       MACRO.EXTENSION$           = "MCR"
  1027.       MAIN.COMMANDS.DEFAULTS$    = "ABCDEFIJKOPRSTUVW@"
  1028.       MAIN.COMMANDS$             = MAIN.COMMANDS.DEFAULTS$
  1029.       MAIN.FUNCTION$(1,1)        = "A)nswer questionnaire  "
  1030.       MAIN.FUNCTION$(2,1)        = "B)ulletins             "
  1031.       MAIN.FUNCTION$(3,1)        = "C)omments              "
  1032.       MAIN.FUNCTION$(4,1)        = "D)oor subsystem        "
  1033.       MAIN.FUNCTION$(5,1)        = "E)nter message         "
  1034.       MAIN.FUNCTION$(6,1)        = "F)iles subsystem       "
  1035.       MAIN.FUNCTION$(7,1)        = "I)nitial welcome       "
  1036.       MAIN.FUNCTION$(8,1)        = "J)oin a conference     "
  1037.       MAIN.FUNCTION$(9,1)        = "K)ill messages         "
  1038.       MAIN.FUNCTION$(10,1)       = "O)perator page         "
  1039.       MAIN.FUNCTION$(11,1)       = "P)ersonal mail         "
  1040.       MAIN.FUNCTION$(12,1)       = "R)ead messages         "
  1041.       MAIN.FUNCTION$(13,1)       = "S)can messages header  "
  1042.       MAIN.FUNCTION$(14,1)       = "T)opic msg scan        "
  1043.       MAIN.FUNCTION$(15,1)       = "U)tilities subsystem   "
  1044.       MAIN.FUNCTION$(16,1)       = "V)iew conference mail  "
  1045.       MAIN.FUNCTION$(17,1)       = "W)ho's on other nodes  "
  1046.       MAIN.FUNCTION$(18,1)       = "@)Library subsystem    "
  1047.       MAIN.FUNCTION$(1,2)        = "A"
  1048.       MAIN.FUNCTION$(2,2)        = "B"
  1049.       MAIN.FUNCTION$(3,2)        = "C"
  1050.       MAIN.FUNCTION$(4,2)        = "D"
  1051.       MAIN.FUNCTION$(5,2)        = "E"
  1052.       MAIN.FUNCTION$(6,2)        = "F"
  1053.       MAIN.FUNCTION$(7,2)        = "I"
  1054.       MAIN.FUNCTION$(8,2)        = "J"
  1055.       MAIN.FUNCTION$(9,2)        = "K"
  1056.       MAIN.FUNCTION$(10,2)       = "O"
  1057.       MAIN.FUNCTION$(11,2)       = "P"
  1058.       MAIN.FUNCTION$(12,2)       = "R"
  1059.       MAIN.FUNCTION$(13,2)       = "S"
  1060.       MAIN.FUNCTION$(14,2)       = "T"
  1061.       MAIN.FUNCTION$(15,2)       = "U"
  1062.       MAIN.FUNCTION$(16,2)       = "V"
  1063.       MAIN.FUNCTION$(17,2)       = "W"
  1064.       MAIN.MESSAGE.BACKUP$       = D$ + "MESSAGES.BAK"
  1065.       MAIN.MESSAGE.FILE$         = D$ + "MESSAGES"
  1066.       MAIN.PUI$                  = D$ + "MAIN.PUI"
  1067.       MAIN.USER.FILE$            = D$ + "USERS"
  1068.       MASTER.DIRECTORY.NAME$     = ""
  1069.       MAX.ALLOWED.MSGS.FRM.DEF   = 5
  1070.       MAX.CARRIER.WAIT           = 30
  1071.       MAX.DESC.LEN               = 40
  1072.       MAX.EXTENDED.LINES         = 2
  1073.       MAX.MESSAGE.LINES          = 19
  1074.       MAX.PER.DAY                = 0
  1075.       MAX.REG.SEC                = 0
  1076.       MAX.USR.FILE.SIZE.FRM.DEF  = 16
  1077.       MAX.WORK.VAR               = 30
  1078.       MAXD                       = 15
  1079.       MAXIMUM.DISPLAYABLE.PAGES  = 17
  1080.       MAXIMUM.PASSWORD.CHANGES   = 3
  1081.       MAXIMUM.VIOLATIONS         = 5
  1082.       MAXIMUM.NUMBER.OF.NODES    = 1
  1083.       MENU$(1)                   = D$ + "MENU1"
  1084.       MENU$(2)                   = D$ + "MENU2"
  1085.       MENU$(3)                   = D$ + "MENU3"
  1086.       MENU$(4)                   = D$ + "MENU4"
  1087.       MENU$(5)                   = D$ + "MENU5"
  1088.       MENU$(6)                   = D$ + "MENU6"
  1089.       MENUS.CAN.PAUSE            = TRUE
  1090.       MESSAGE.REMINDER           = TRUE
  1091.       MESSAGES.CAN.GROW          = FALSE
  1092.       MIN.NEWCALLER.BAUD         = 0
  1093.       MIN.OLDCALLER.BAUD         = 0
  1094.       MIN.SEC.TO.VIEW            = DEFAULT.SECURITY.LEVEL
  1095.       MINIMUM.LOGON.SECURITY     = 0
  1096.       MINIMUM.SECURITY.FOR.TEMP.PASSWORD = 5
  1097.       MINUTES.PER.SESSION!       = 72
  1098.       MLCOM                      = FALSE
  1099.       MM                         = 5
  1100.       MNP.SUPPORT                = FALSE
  1101.       MO$                        = DD$
  1102.       MODEM.ANSWER.COMMAND$      = "ATQ0X1V1A"
  1103.       MODEM.COMMAND.DELAY.TIME   = 1
  1104.       MODEM.COUNT.RINGS.COMMAND$ = "ATS1?"
  1105.       MODEM.GO.OFFHOOK.COMMAND$  = "ATQ1E1H1M0"
  1106.       MODEM.INIT.BAUD$           = "300"
  1107.       MODEM.INIT.COMMAND$        = "ATM0Q1S2=255S10=30E0Q0X1S0=254  "
  1108.       MODEM.INIT.WAIT.TIME       = 2
  1109.       MODEM.RESET.COMMAND$       = "ATZ"
  1110.       MUSIC                      = FALSE
  1111.       NET.MAIL$                  = "<none>"
  1112.       NETWORK.TYPE               = 0
  1113.       NETWORK.TYPE$              = "IBM's DOS"
  1114.       NEW.FILES.CHECK            = FALSE
  1115.       NEW.USER.QUESTIONNAIRE$    = D$ + "RBBS-REG.DEF"
  1116.       NEWUSER.FILE$              = D$ + "NEWUSER"
  1117.       NEWUSER.SETS.DEFAULTS      = TRUE
  1118.       OMIT.MAIN.DIRECTORY$       = "NO"
  1119.       OMIT.UPLOAD.DIRECTORY$     = "NO"
  1120.       OVERWRITE.SECURITY.LEVEL   = SYSOP.SECURITY.LEVEL
  1121.       PAGE.LENGTH                = 23
  1122.       PAGING.PRINTER.SUPPORT$    = ". "
  1123.       PASSWORD.FILE$             = D$ + "PASSWRDS"
  1124.       PCJR                       = FALSE
  1125.       PERSONAL.BEGIN             = 1
  1126.       PERSONAL.DIR$              = D$+"PRIV.DEF"
  1127.       PERSONAL.DRVPATH$          = D$
  1128.       PERSONAL.LEN               = 31
  1129.       PERSONAL.CONCAT            = FALSE
  1130.       PRELOG$                    = D$ + "PRELOG"
  1131.       PRIVATE.READ.SEC           = DEFAULT.SECURITY.LEVEL
  1132.       PROTO.DEF$                 = D$ + "PROTO.DEF"
  1133.       PROMPT.BELL                = 0
  1134.       PROMPT.HASH$               = "Name"
  1135.       PROMPT.INDIV$              = ""
  1136.       PS                         = 5
  1137.       PUBLIC.READ.SEC            = DEFAULT.SECURITY.LEVEL
  1138.       QUES.PATH$                 = D$
  1139.       RBBS.BAT$                  = D$ + "RBBS" + NODE.ID$ + ".BAT"
  1140.       RBBS.NAME$                 = "RBBS-PC"
  1141.       RCTTY.BAT$                 = D$ + "RCTTY" + NODE.ID$ + ".BAT"
  1142.       RECYCLE.TO.DOS             = 0
  1143.       RECYCLE.TO.DOS$            = "INTERNAL"
  1144.       RECYCLE.WAIT               = 0
  1145.       REDIRECT.IO.METHOD         = TRUE
  1146.       REGISTRATION.PROGRAM$      = "<none>"
  1147.       REMEMBER.NEW.USERS         = TRUE
  1148.       REMIND.FILE.TRANSFERS      = FALSE
  1149.       REMIND.PROFILE             = FALSE
  1150.       REQUIRE.NON.ASCII          = TRUE
  1151.       REQUIRED.QUESTIONNAIRE$    = "<none>"
  1152.       REQUIRED.RINGS             = 1
  1153.       RESTRICT.BAUD              = FALSE
  1154.       RESTRICT.BY.DATE           = FALSE
  1155.       RESTRICT.VALID.CMDS        = FALSE
  1156.       RTS$                       = "NO"
  1157.       SCREEN.OUT.MSG$            = "SEEN-BY: "
  1158.       SEC.CHANGE.MSG             = SYSOP.SECURITY.LEVEL
  1159.       SEC.LVL.EXEMPT.FRM.PURGING = SYSOP.SECURITY.LEVEL
  1160.       SECVIO.HLP$                = D$ + "SECVIO." + HELP.EXTENSION$
  1161.       SECURITY.EXEMPT.FROM.EPILOG= DEFAULT.SECURITY.LEVEL + 1
  1162.       SF                         = SYSOP.SECURITY.LEVEL
  1163.       SHOOT.YOURSELF             = FALSE
  1164.       SHOW.SECTION               = TRUE
  1165.       SIZE.OF.STACK              = 1024
  1166.       SL.CATEGORIZE.UPLOADS      = SYSOP.SECURITY.LEVEL
  1167.       SMART.TEXT                 = 123
  1168.       START.HASH                 = 1
  1169.       START.INDIV                = 0
  1170.       START.OFFICE.HOURS         = 800
  1171.       SURVIVE.NOUSER.ROOM        = FALSE
  1172.       SWITCH.BACK                = FALSE
  1173.       SYSOP.COMMANDS.DEFAULTS$   = "1234567"
  1174.       SYSOP.COMMANDS$            = SYSOP.COMMANDS.DEFAULTS$
  1175.       SYSOP.FUNCTION$(1,1)       = " 1 List comments      "
  1176.       SYSOP.FUNCTION$(2,1)       = " 2 List CALLERS log   "
  1177.       SYSOP.FUNCTION$(3,1)       = " 3 Recover a message  "
  1178.       SYSOP.FUNCTION$(4,1)       = " 4 Erase comments     "
  1179.       SYSOP.FUNCTION$(5,1)       = " 5 User maintenance   "
  1180.       SYSOP.FUNCTION$(6,1)       = " 6 Toggle Page bell   "
  1181.       SYSOP.FUNCTION$(7,1)       = " 7 Exit to DOS        "
  1182.       SYSOP.FUNCTION$(1,2)       = " 1"
  1183.       SYSOP.FUNCTION$(2,2)       = " 2"
  1184.       SYSOP.FUNCTION$(3,2)       = " 3"
  1185.       SYSOP.FUNCTION$(4,2)       = " 4"
  1186.       SYSOP.FUNCTION$(5,2)       = " 5"
  1187.       SYSOP.FUNCTION$(6,2)       = " 6"
  1188.       SYSOP.FUNCTION$(7,2)       = " 7"
  1189.       SYSOP.FIRST.NAME$          = "TOM"
  1190.       SYSOP.LAST.NAME$           = "MACK"
  1191.       SYSOP.MENU.SECURITY.LEVEL  = SYSOP.SECURITY.LEVEL
  1192.       SYSOP.PASSWORD.1$          = "RBBS-PC"
  1193.       SYSOP.PASSWORD.2$          = "CPC17-2A"
  1194.       TIME.TO.DROP.TO.DOS        = 0
  1195.       TRASHCAN.FILE$             = D$ + "TRASHCAN"
  1196.       TURN.PRINTER.OFF           = FALSE
  1197.       TURBO.RBBS                 = TRUE
  1198.       UE                         = 5
  1199.       FMS.DIRECTORY$             = ""
  1200.       UPCAT.HELP$                = "UPCAT"
  1201.       UPLOAD.DIRECTORY$          = "99"
  1202.       UPLOAD.PATH$               = D$
  1203.       UPLOAD.SUBDIR$             = ""
  1204.       UPLOAD.TIME.FACTOR!        = 0
  1205.       UPLOAD.TO.SUBDIR           = FALSE
  1206.       USE.BASIC.WRITES           = FALSE
  1207.       USE.DEVICE.DRIVER$         = ""
  1208.       USER.INITIALIZE.COMMAND$   = "AT&C1&D3B1E0V1M0S0=0&T5"
  1209.       USER.FIRMWARE.CLEAR.CMND$  = "AT&F"
  1210.       USER.FIRMWARE.WRITE.CMND$  = "&W"
  1211.       USER.LOCATION$             = "CITY and STATE"
  1212.       UTIL.COMMANDS.DEFAULTS$    = "BCEFGLMPRSTU"
  1213.       UTIL.COMMANDS$             = UTIL.COMMANDS.DEFAULTS$
  1214.       UTILITY.FUNCTION$(1,1)     = "B)aud rate            "
  1215.       UTILITY.FUNCTION$(2,1)     = "C)lock (time)         "
  1216.       UTILITY.FUNCTION$(3,1)     = "E)cho                 "
  1217.       UTILITY.FUNCTION$(4,1)     = "F)ile x-fer protocol  "
  1218.       UTILITY.FUNCTION$(5,1)     = "G)raphics             "
  1219.       UTILITY.FUNCTION$(6,1)     = "L)ines per page       "
  1220.       UTILITY.FUNCTION$(7,1)     = "M)sg margin setting   "
  1221.       UTILITY.FUNCTION$(8,1)     = "P)assword change      "
  1222.       UTILITY.FUNCTION$(9,1)     = "R)eview defaults      "
  1223.       UTILITY.FUNCTION$(10,1)    = "S)tatistics           "
  1224.       UTILITY.FUNCTION$(11,1)    = "T)oggle               "
  1225.       UTILITY.FUNCTION$(12,1)    = "U)ser log scan        "
  1226.       VOICE.TYPE                 = 0
  1227.       VOICE.TYPE$                = "None"
  1228.       XON.XOFF                   = FALSE
  1229.       FOR I = 1 TO LEN(UTIL.COMMANDS.DEFAULTS$)
  1230.          UTILITY.FUNCTION$(I,2) = MID$(UTIL.COMMANDS.DEFAULTS$,I,1)
  1231.       NEXT
  1232.       WAIT.BEFORE.DISCONNECT     = 180
  1233.       WELCOME.FILE$              = D$ + "WELCOME"
  1234.       WELCOME.INTERRUPTABLE      = TRUE
  1235.       WILL.SUBDIRS.B.USED        = FALSE
  1236.       WRITE.BUF.DEF              = 1024
  1237.       FOR I = 1 TO NUM.SYSOP
  1238.          SYSOP.FUNCTION(I) = SF
  1239.       NEXT
  1240.       FOR I = 1 TO NUM.MAIN
  1241.          MAIN.FUNCTION(I) = MM
  1242.       NEXT
  1243.       FOR I = 1 TO NUM.FILES
  1244.          FILES.FUNCTION(I) = FC
  1245.       NEXT
  1246.       FOR I = 1 TO NUM.LIBRARY
  1247.          LIBRARY.FUNCTION(I) = PS
  1248.       NEXT
  1249.       FOR I = 1 TO NUM.UTILITY
  1250.          UTILITY.FUNCTION(I) = UE
  1251.       NEXT
  1252.       FOR I = 1 TO NUM.GLOBAL
  1253.          GLOBAL.FUNCTION(I) = GB
  1254.       NEXT
  1255.       END SUB
  1256. '  $SUBTITLE: 'VOICETYPE - subroutine to select voice'
  1257. '  $PAGE
  1258. '
  1259. '  SUBROUTINE NAME    --  VOICETYPE
  1260. '
  1261. '  INPUT PARAMETERS   --  VOICE.TYPE
  1262. '                         VOICE.TYPE$
  1263. '                         SUBROUTINE.PARAMETER
  1264. '
  1265. '  OUTPUT PARAMETERS  --  VOICE.TYPE
  1266. '                         VOICE.TYPE$
  1267. '
  1268. '  SUBROUTINE PURPOSE --  TO SELECT THE RBBS-PC SUPPORTED VOICE
  1269. '                         SYNTHESIZERS
  1270. '
  1271.       SUB VOICETYPE STATIC
  1272.       ON SUBROUTINE.PARAMETER GOTO 60482,60484
  1273. 60482 CLS
  1274.       LOCATE 3,1
  1275.       PRINT "     RBBS-PC is supported in the following:"
  1276.       PRINT "            Voice Synthesizers"
  1277.       PRINT "          0. None"
  1278.       PRINT "          1. CompuTalker"
  1279.       PRINT "             B.G. MICRO"
  1280.       PRINT "             P.O. Box 280298"
  1281.       PRINT "             Dallas, Texas 75228"
  1282.       PRINT "          2. HearSay 1000"
  1283.       PRINT "             HEARSAY INC."
  1284.       PRINT "             1825 74th Street"
  1285.       PRINT "             Brooklyn, New York 11204"
  1286. 60483 CALL ASKRO("Select environment (0 to 2, [ENTER] quits)",24,X$)
  1287.       IF X$ = "" THEN _
  1288.          EXIT SUB
  1289.       VOICE.TYPE = VAL(X$)
  1290.       IF VOICE.TYPE < 0 OR VOICE.TYPE > 2 THEN _
  1291.          GOTO 60483
  1292. 60484 IF VOICE.TYPE = 0 THEN _
  1293.          VOICE.TYPE$ = "None"
  1294.       IF VOICE.TYPE = 1 THEN _
  1295.          VOICE.TYPE$ = "CompuTalker"
  1296.       IF VOICE.TYPE = 2 THEN _
  1297.          VOICE.TYPE$ = "HearSay 1000"
  1298.       END SUB
  1299. '  $SUBTITLE: 'ASKRO - ask a question at a specific row'
  1300. '  $PAGE
  1301. '
  1302. '  SUBROUTINE NAME    --  ASKRO
  1303. '
  1304. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1305. '                         ANS$           STRING TO PUT THE ANSWER IN
  1306. '                         STRNG$         STRING CONTAINING THE QUESTION
  1307. '                         RO             ROW TO ASK THE QUESTION ON
  1308. '
  1309. '  OUTPUT PARAMETERS  --  ANS$           RESPONSE FROM THE KEYBOARD
  1310. '
  1311. '  SUBROUTINE PURPOSE --  TO ASK A QUESTION ON THE PC'S DISPLAY AT A
  1312. '                         SPECIFIC ROW
  1313. '
  1314.       SUB ASKRO (STRNG$,RO,ANS$) STATIC
  1315. 61100 LOCATE RO,1
  1316.       PRINT SPACE$(79);
  1317.       LOCATE RO,5
  1318.       PRINT STRNG$;" ";
  1319.       LINE INPUT;ANS$
  1320.       END SUB
  1321. '  $SUBTITLE: 'GETINIT - get an integer'
  1322. '  $PAGE
  1323. '
  1324. '  SUBROUTINE NAME    --  GETINIT
  1325. '
  1326. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1327. '                         ANS            WHERE TO PUT THE ANSWER IN
  1328. '                         STRNG$         STRING CONTAINING THE QUESTION
  1329. '                         RO             ROW TO ASK THE QUESTION ON
  1330. '                         MIN            MINIMUM ACCEPTABLE NUMBER
  1331. '                         MAX            MAXIMUM ACCEPTABLE NUMBER
  1332. '
  1333. '  OUTPUT PARAMETERS  --  ANS            RESPONSE FROM THE KEYBOARD
  1334. '
  1335. '  SUBROUTINE PURPOSE --  TO ASK A QUESTION ON THE PC'S DISPLAY AT A
  1336. '                         SPECIFIC ROW AND GET AN INTEGER BACK
  1337. '
  1338.       SUB GETINIT (STRNG$,RO,MIN,MAX,ANS,CR) STATIC
  1339. 61110 LOCATE RO,1
  1340.       CR = FALSE
  1341.       ANS = MIN
  1342.       PRINT SPACE$(79);
  1343.       LOCATE RO,5
  1344.       PRINT STRNG$;" ";
  1345.       LINE INPUT;ANS$
  1346.       IF ANS$ = "" THEN _
  1347.          CR = TRUE : _
  1348.          EXIT SUB
  1349.       IF VAL(ANS$) < MIN OR _
  1350.          VAL(ANS$) > MAX THEN _
  1351.          GOTO 61110
  1352.       ANS = VAL(ANS$)
  1353.       END SUB
  1354. '  $SUBTITLE: 'GETNUMYN - get a TRUE-FALSE answer to a YES OR NO question'
  1355. '  $PAGE
  1356. '
  1357. '  SUBROUTINE NAME    --  GETNUMYN
  1358. '
  1359. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1360. '                         STRNG$         STRING CONTAINING THE QUESTION
  1361. '
  1362. '  OUTPUT PARAMETERS  --  ANS            Returned value - -1 IF yes, 0 IF no
  1363. '
  1364. '  SUBROUTINE PURPOSE --  TO ASK A QUESTION ON THE PC'S DISPLAY AND GET A
  1365. '                         YES OR NO ANSWER CONVERTED TO TRUE/FALSE
  1366. '
  1367.        SUB GETNUMYN (STRNG$,ANS) STATIC
  1368.        CALL GETYESNO (STRNG$,ANS$)
  1369.        ANS = FNYESNO (ANS$)
  1370.        END SUB
  1371. '  $SUBTITLE: 'GETYESNO - Ask a YES OR NO question'
  1372. '  $PAGE
  1373. '
  1374. '  SUBROUTINE NAME    --  GETYESNO
  1375. '
  1376. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1377. '                         ANS$           STRING TO PUT THE ANSWER IN
  1378. '                         STRNG$         STRING CONTAINING THE QUESTION
  1379. '
  1380. '  OUTPUT PARAMETERS  --  ANS$           RESPONSE FROM THE KEYBOARD
  1381. '
  1382. '  SUBROUTINE PURPOSE --  TO ASK A QUESTION ON THE PC'S DISPLAY AND GET A
  1383. '                         YES OR NO ANSWER
  1384. '
  1385.       SUB GETYESNO (STRNG$,ANS$) STATIC
  1386. 61200 CALL ASKRO (STRNG$+" (Y)es or N)o)",24,HJ$)
  1387.       L = LEN(HJ$)
  1388.       IF L < 1 OR L > 3 THEN _
  1389.          GOTO 61207
  1390.       CALL ALLCAPS(HJ$)
  1391.       X = INSTR("NY",LEFT$(HJ$,1))
  1392.       ON X GOTO 61210,61212
  1393. 61207 BEEP
  1394.       GOTO 61200
  1395. 61210 ANS$ = "NO"
  1396.       EXIT SUB
  1397. 61212 ANS$ = "YES"
  1398.       EXIT SUB
  1399.       END SUB
  1400. '  $SUBTITLE: 'ALLCAPS - convert a sting into all capital letters'
  1401. '  $PAGE
  1402. '
  1403. '  SUBROUTINE NAME    --  ALLCAPS
  1404. '
  1405. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1406. '                         STRNG$         STRING CONTAINING THE QUESTION
  1407. '
  1408. '  OUTPUT PARAMETERS  --  STRNG$         CAPITALIZED STRING
  1409. '
  1410. '  SUBROUTINE PURPOSE --  TO CAPITALIZE A STRING
  1411. '
  1412.       SUB ALLCAPS (STRNG$) STATIC
  1413.       FOR Z = 1 TO LEN(STRNG$)
  1414.         MID$(STRNG$,Z,1) = CHR$(ASC(MID$(STRNG$,Z,1)) + _
  1415.                            32 * (ASC(MID$(STRNG$,Z,1)) > 96))
  1416.       NEXT
  1417.       END SUB
  1418. '  $SUBTITLE: 'ASKUPOS - find the unique user field for USERS'
  1419. '  $PAGE
  1420. '
  1421. '  SUBROUTINE NAME    --  ASKUPOS
  1422. '
  1423. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1424. '                         HDR$           HEADER
  1425. '                         BEGIN.COL      BEGINNING COLUMN OF FIELD
  1426. '                         FIELD.LEN      LENGTH OF FIELD IN USER'S RECORD
  1427. '                         PRMPT$         PROMPT TO GIVE FOR FIELD
  1428. '
  1429. '  OUTPUT PARAMETERS  --  ABOVE INPUTS UPDATED WITH USER'S RESPONSES
  1430. '
  1431. '  SUBROUTINE PURPOSE --  TO ASK THE SYSOP WHAT UNIQUE FIELD IN THE USERS
  1432. '                         RECORD IS TO BE ASKED FOR AT LOGON
  1433. '
  1434.       SUB ASKUPOS (HDR$,BEGIN.COL,FIELD.LEN,PRMPT$) STATIC
  1435.       CLS
  1436.       LOCATE 3,20
  1437.       PRINT HDR$;
  1438. 61300 LOCATE 6,5
  1439.       PRINT "1.  BEGINNING COLUMN in USERS file";TAB(44);STR$(BEGIN.COL);"   ";
  1440.       LOCATE 8,5
  1441.       PRINT "2.  Number of CHARACTERS to use";TAB(44);STR$(FIELD.LEN);"   ";
  1442.       LOCATE 10,5
  1443.       PRINT "3.  PROMPT to display to callers";TAB(45);PRMPT$;SPACE$(34-LEN(PRMPT$));
  1444. 61310 CALL ASKRO ("Select option to change (1-3, ENTER to end)",24,X$)
  1445.       IF X$ = "" THEN _
  1446.          EXIT SUB
  1447.       X = VAL(X$)
  1448.       IF X < 1 OR X > 3 THEN _
  1449.          GOTO 61310
  1450.       ON X GOTO 61320,61330,61340
  1451. 61320 CALL ASKRO ("New BEGINNING COLUMN",24,HJ$)
  1452.       IF HJ$ = "" THEN _
  1453.          GOTO 61320
  1454.       X = VAL(HJ$)
  1455.       IF X < 0 OR X > 128 THEN _
  1456.          GOTO 61320
  1457.       BEGIN.COL = X
  1458.       GOTO 61300
  1459. 61330 CALL ASKRO ("New # CHARACTERS to use",24,HJ$)
  1460.       IF HJ$ = "" THEN _
  1461.          GOTO 61330
  1462.       X = VAL(HJ$)
  1463.       IF X < 0 OR X > 31 THEN _
  1464.          GOTO 61330
  1465.       FIELD.LEN = X
  1466.       GOTO 61300
  1467. 61340 CALL ASKRO ("New PROMPT",24,HJ$)
  1468.       IF LEN(HJ$) > 34 THEN _
  1469.          GOTO 61340
  1470.       PRMPT$ = HJ$
  1471.       GOTO 61300
  1472.       END SUB
  1473. '  $SUBTITLE: 'ANYNUMBER - input any numeric value'
  1474. '  $PAGE
  1475. '
  1476. '  SUBROUTINE NAME    --  ANYNUMBER
  1477. '
  1478. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1479. '                         PRMPT$           PROMPT
  1480. '
  1481. '  OUTPUT PARAMETERS  --  RETURNED.VALUE!  VALUE RETURNED
  1482. '
  1483. '  SUBROUTINE PURPOSE --  TO GET A NUMERIC VALUE
  1484. '
  1485.       SUB ANYNUMBER (PRMPT$,RETURNED.VALUE!) STATIC
  1486. 61400 CALL ASKRO (PRMPT$,24,HJ$)
  1487.       RETURNED.VALUE! = VAL(HJ$)
  1488.       END SUB
  1489. '  $SUBTITLE: 'ANYINTEGER - input any integer value'
  1490. '  $PAGE
  1491. '
  1492. '  SUBROUTINE NAME    --  ANYINTEGER
  1493. '
  1494. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1495. '                         PRMPT$           PROMPT TO DISPLAY
  1496. '
  1497. '  OUTPUT PARAMETERS  --  RETURNED.VALUE   VALUE RETURNED
  1498. '
  1499. '  SUBROUTINE PURPOSE --  TO GET AN INTEGER VALUE
  1500. '
  1501.       SUB ANYINTEGER (PRMPT$,RETURNED.VALUE) STATIC
  1502. 61450 CALL ANYNUMBER (PRMPT$,RETURNED.VALUE!)
  1503.       IF RETURNED.VALUE! >  32767.0 OR _
  1504.          RETURNED.VALUE! < -32767.0 THEN_
  1505.          BEEP : _
  1506.          GOTO 61450
  1507.       RETURNED.VALUE = RETURNED.VALUE!
  1508.       END SUB
  1509. '  $SUBTITLE: 'MMINTEGER - input any integer value with range check'
  1510. '  $PAGE
  1511. '
  1512. '  SUBROUTINE NAME    --  MMINTEGER
  1513. '
  1514. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1515. '                         PRMPT$           PROMPT
  1516. '                         MIN              MINIMUM VALUE (INCLUSIVE)
  1517. '                         MAX              MAXIMUM VALUE (INCLUSIVE)
  1518. '
  1519. '  OUTPUT PARAMETERS  --  RETURNED.VALUE   VALUE RETURNED
  1520. '
  1521. '  SUBROUTINE PURPOSE --  TO GET AN INTEGER VALUE WITHIN A RANGE
  1522. '
  1523.       SUB MMINTEGER (PRMPT$,MIN,MAX,RETURNED.VALUE) STATIC
  1524. 61500 CALL ANYINTEGER (PRMPT$,RETURNED.VALUE)
  1525.       IF RETURNED.VALUE < MIN OR RETURNED.VALUE > MAX THEN _
  1526.          BEEP : _
  1527.          GOTO 61500
  1528.       END SUB
  1529. '  $SUBTITLE: 'FINDFILE - Determine whether a file exists'
  1530. '  $PAGE
  1531. '
  1532. '  SUBROUTINE NAME    --  FINDFILE
  1533. '
  1534. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1535. '                         FILNAME$         FILE TO LOOK FOR
  1536. '                         FEXISTS          WHETHER FILE EXISTS
  1537. '
  1538. '  OUTPUT PARAMETERS  --  RETURNED.VALUE   VALUE RETURNED
  1539. '
  1540. '  SUBROUTINE PURPOSE --  DETERMINE WHETHER PASSED FILE NAME EXISTS
  1541. '                         RETURN TRUE OR FALSE IN "FEXISTS"
  1542. '
  1543.       SUB FINDFILE (FILNAME$,FEXISTS) STATIC
  1544. 61600 CALL RBBSFIND (FILNAME$,Z,Y,M,D)
  1545.       FEXISTS = (Z = 0)
  1546.       END SUB
  1547. '  $SUBTITLE: 'CHKFMSDIR - Validate structure of FMS directory'
  1548. '  $PAGE
  1549. '
  1550. '  SUBROUTINE NAME    --  CHKFMSDIR
  1551. '
  1552. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1553. '                         FMSDIR$         NAME OF FMS DIRECTORY
  1554. '                         LINELEN         PROPER LENGTH OF LINES
  1555. '                                         (EXCLUDING CR/LF AT END)
  1556. '                         FMS.DIRCAT$     CATEGORY FILE FOR FMS
  1557. '
  1558. '  OUTPUT PARAMETERS  --  RETURNED.VALUE   VALUE RETURNED
  1559. '
  1560. '  SUBROUTINE PURPOSE --  VERIFIES THAT FMS IS IN VALID FORMAT
  1561. '                         AND DIAGNOSES PROBLEMS
  1562. '
  1563. 61700 SUB CHKFMSDIR (FMSDIR$,LINELEN,FMS.DIRCAT$) STATIC
  1564.       DIM CAT.CODE$(99)
  1565.       CLS
  1566.       LOCATE 5,20
  1567.       PRINT "Checking FMS file ";FMSDIR$;
  1568.       NLINES = 0
  1569.       LOCATE 7,27
  1570.       PRINT "Line #";
  1571.       LOCATE 9,20
  1572.       COLOR 0,7
  1573.       PRINT " Last Line with an ERROR ";
  1574.       LOCATE 12,28
  1575.       PRINT " Last ERROR ";
  1576.       COLOR 7,0
  1577.       NCATS = 0
  1578.       CALL FINDFILE (FMS.DIRCAT$,FEXISTS)
  1579.       IF FEXISTS THEN _
  1580.          NCATS = 1:_
  1581.          CAT.CODE$(1) = "***":_
  1582.          OPEN FMS.DIRCAT$ FOR INPUT AS #2 : _
  1583.          WHILE NOT EOF(2) AND NCATS < UBOUND(CAT.CODE$) :_
  1584.             NCATS = NCATS + 1:_
  1585.             INPUT #2,X$,Y$,X$:_
  1586.             CAT.CODE$(NCATS) = Y$:_
  1587.          WEND:_
  1588.          CLOSE 2
  1589.       GO.ON = -1
  1590.       CALL FINDFILE (FMSDIR$,FEXISTS)
  1591.       IF NOT FEXISTS THEN _
  1592.          LOCATE 6,25 : _
  1593.          PRINT "File not found"; : _
  1594.          GOTO 61750
  1595.       OPEN FMSDIR$ FOR INPUT AS #2
  1596.       WHILE NOT EOF(2) AND GO.ON
  1597.          NLINES = NLINES + 1
  1598.          LINE INPUT #2, A$
  1599.          L = LEN(A$)
  1600.          LOCATE 7,36
  1601.          PRINT NLINES;
  1602.          IF L > LINELEN THEN _
  1603.             CALL HANDERR (A$,NLINES,"Too LONG: has" + STR$(L) + " chars but should have" + STR$(LINELEN),GO.ON):_
  1604.             IF NOT GO.ON THEN _
  1605.                GOTO 61740
  1606.          IF L < LINELEN THEN _
  1607.             X$ = "Too SHORT: has" + STR$(L) + " chars but should have" + STR$(LINELEN) : _
  1608.             CALL HANDERR (A$,NLINES,X$,GO.ON):_
  1609.             IF NOT GO.ON THEN _
  1610.                GOTO 61740
  1611.          IF L > 0 THEN _
  1612.             IF INSTR ("\* ",LEFT$(A$,1)) THEN _
  1613.                GOTO 61740
  1614.          IF L > 30 THEN _
  1615.             X$ = MID$(A$,24,2) + _
  1616.                  MID$(A$,27,2) + _
  1617.                  MID$(A$,30,2) : _
  1618.             I = 1 : _
  1619.             WHILE I < 7 AND INSTR("0123456789",MID$(X$,I,1)) > 0 : _
  1620.                I = I + 1: _
  1621.             WEND: _
  1622.             IF I < 7 THEN _
  1623.                CALL HANDERR (A$,NLINES,"INVALID CHARACTER <" + MID$(X$,I,1) + "> in date field",GO.ON) : _
  1624.                IF NOT GO.ON THEN _
  1625.                   GOTO 61740
  1626.          I = 1
  1627.          Y$ = MID$(A$,L - 2)
  1628.          CALL REMOVE (Y$," ")
  1629.          WHILE I <= NCATS AND Y$ <> CAT.CODE$(I)
  1630.             I = I + 1
  1631.          WEND
  1632.          IF I > NCATS THEN _
  1633.             CALL HANDERR (A$,NLINES,"Category code <" + Y$ + "> NOT IN " + FMS.DIRCAT$,GO.ON)
  1634. 61740 WEND
  1635. 61750 CLOSE 2
  1636.       IF GO.ON THEN _
  1637.          LOCATE 15,15:_
  1638.          BEEP:_
  1639.          CALL ASKRO ("           Done checking.  Press [ENTER] to continue",20,ANS$)
  1640.       END SUB
  1641. '  $SUBTITLE: 'CHKPERSDIR - Validate personal directories'
  1642. '  $PAGE
  1643. '
  1644. '  SUBROUTINE NAME    --  CHKPERSDIR
  1645. '
  1646. '  INPUT PARAMETERS   --  PARAMETER         MENANING
  1647. '                         PDIR$           NAME OF PERSONAL DIRECTORY
  1648. '                         NAMELEN         PROPER LENGTH OF NAME FIELD
  1649. '
  1650. '  OUTPUT PARAMETERS  --  NONE
  1651. '
  1652. '  SUBROUTINE PURPOSE --  CHECKS PERSONAL DIRECTORY FOR PROPER FORMAT
  1653. '
  1654. 61755 SUB CHKPERSDIR (PDIR$, DESC.LEN, NAMELEN) STATIC
  1655.       CLS
  1656.       LOCATE 5, 21
  1657.       PRINT "Checking Personal Directory "; PDIR$;
  1658.       NLINES = 0
  1659.       LOCATE 7, 27
  1660.       PRINT "Line #";
  1661.       LOCATE 9, 20
  1662.       COLOR 0, 7
  1663.       PRINT " Last Line with an ERROR ";
  1664.       LOCATE 12, 28
  1665.       PRINT " Last ERROR ";
  1666.       COLOR 7, 0
  1667.       GO.ON = -1
  1668.       CALL FINDFILE(PDIR$, FEXISTS)
  1669.       IF NOT FEXISTS THEN _
  1670.          LOCATE 6, 25: _
  1671.          PRINT "File not found"; : _
  1672.          GOTO 61775
  1673.       LINELEN = 34 + DESC.LEN + NAMELEN
  1674.       OPEN PDIR$ FOR INPUT AS #2
  1675.       WHILE NOT EOF(2) AND GO.ON
  1676.          NLINES = NLINES + 1
  1677.          LINE INPUT #2, A$
  1678.          L = LEN(A$)
  1679.          LOCATE 7, 36
  1680.          PRINT NLINES;
  1681.          IF L > LINELEN THEN _
  1682.             CALL HANDERR(A$, NLINES, "Too LONG: has" + STR$(L) + " chars but should have" + STR$(LINELEN), GO.ON) : _
  1683.             IF NOT GO.ON THEN _
  1684.                GOTO 61770
  1685.          IF L < LINELEN THEN _
  1686.             CALL HANDERR(A$, NLINES, "Too SHORT: has" + STR$(L) + " chars but should have" + STR$(LINELEN), GO.ON) : _
  1687.                IF NOT GO.ON THEN _
  1688.                   GOTO 61770
  1689.          IF L > 30 THEN _
  1690.             X$ = MID$(A$, 24, 2) + MID$(A$, 27, 2) + MID$(A$, 30, 2) : _
  1691.             I = 1 : _
  1692.             WHILE I < 7 AND INSTR("0123456789", MID$(X$, I, 1)) > 0 : _
  1693.                I = I + 1 : _
  1694.             WEND : _
  1695.             IF I < 7 THEN _
  1696.                CALL HANDERR(A$, NLINES, "INVALID CHARACTER <" + MID$(X$, I, 1) + "> in date field", GO.ON) : _
  1697.                IF NOT GO.ON THEN _
  1698.                   GOTO 61770
  1699.            IF L = LINELEN THEN _
  1700.               X$ = RIGHT$(A$, 1) : _
  1701.               IF INSTR("*!", X$) = 0 THEN _
  1702.                  CALL HANDERR(A$, NLINES, "Last char on line should be * or ! but found <" + X$ + ">", GO.ON) : _
  1703.                  IF NOT GO.ON THEN  _
  1704.                     GOTO 61770
  1705.            IF L = LINELEN THEN _
  1706.               X$ = MID$(A$, L - NAMELEN, LINELEN) : _
  1707.               IF LEFT$(X$, 1) = " " THEN _
  1708.                  IF INSTR("0123456789-", MID$(X$, 2, 1)) = 0 THEN _
  1709.                     CALL HANDERR(A$, NLINES, "Name field at col" + STR$(L - NAMELEN) + " has <" + LEFT$(X$, 1) + ">, needs non-blank or blank+number", GO.ON) : _
  1710.                     IF NOT GO.ON THEN _
  1711.                        GOTO 61770
  1712. 61770 WEND
  1713. 61775 CLOSE 2
  1714.       IF GO.ON THEN _
  1715.          LOCATE 15, 15 : _
  1716.          BEEP : _
  1717.          CALL ASKRO("           Done checking.  Press [ENTER] to continue", 20, ANS$)
  1718.       END SUB
  1719. '  $SUBTITLE: 'HANDERR - subroutine to handle FMS errors'
  1720. '  $PAGE
  1721. '
  1722. '  SUBROUTINE NAME    -- HANDERR
  1723. '
  1724. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  1725. '                        ERRLINE$                LINE THAT HAS THE ERROR
  1726. '                        ERRL                    LINE NUMBER WITH ERROR
  1727. '                        ERRMES$                 ERROR MESSAGE TO ISSUE
  1728. '
  1729. '  OUTPUT PARAMETERS  -- GO.ON                   INIDCATE TO PROCEDURE OR NOT
  1730. '
  1731. '  SUBROUTINE PURPOSE -- TO HANDLE ERROR CHECKING OF THE FMS DIRECTORY
  1732. '
  1733.       SUB HANDERR (ERRLINE$,ERRL,ERRMES$,GO.ON) STATIC
  1734.       LOCATE 10,1
  1735.       PRINT SPACE$(80);
  1736.       LOCATE 10,1
  1737.       PRINT ERRLINE$;
  1738.       LOCATE 9,45
  1739.       PRINT STR$(ERRL);
  1740.       LOCATE 13,1
  1741.       PRINT SPACE$(79);
  1742.       L = LEN(ERRMES$)
  1743.       IF L > 68 THEN _
  1744.          STRT = 1 _
  1745.       ELSE STRT = (70 - L) / 2
  1746.       LOCATE 13,STRT
  1747.       PRINT ERRMES$;
  1748.       CALL ASKRO ("               CONTINUE checking (Y/N,[ENTER]=Y) ",20,ANS$)
  1749.       IF ANS$ = "" THEN _
  1750.          ANS$ = "Y"
  1751.       CALL ALLCAPS (ANS$)
  1752.       GO.ON = FNYESNO (ANS$)
  1753.       END SUB
  1754. ' $SUBTITLE: 'REMOVE - subroutine to delete a string from within a string'
  1755. ' $PAGE
  1756. '
  1757. '  SUBROUTINE NAME    -- REMOVE
  1758. '
  1759. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  1760. '                        BADSTRING$              STRING CONTAINING CHARACTERS
  1761. '                                                TO BE DELETED FROM "L$"
  1762. '                        L$                      STRING TO BE ALTERED
  1763. '
  1764. '  OUTPUT PARAMETERS  -- L$                      WITH THE CHARACTERS IN
  1765. '                                                "BADSTRING#" DELETED FROM IT
  1766. '
  1767. '  SUBROUTINE PURPOSE -- TO REMOVE ALL INSTANCES OF THE CHARACTERS IN
  1768. '                        "BADSTRING$" FROM "L$"
  1769. '
  1770.       SUB REMOVE (L$,BADSTRNG$) STATIC
  1771. 61800 J = 0
  1772.       FOR I = 1 TO LEN(L$)
  1773.          IF INSTR(BADSTRNG$,MID$(L$,I,1)) = 0 THEN_
  1774.             J = J + 1:_
  1775.             MID$(L$,J,1) = MID$(L$,I,1)
  1776.       NEXT I
  1777.       L$ = LEFT$(L$,J)
  1778.       END SUB
  1779. ' $SUBTITLE: 'GETASCII - subroutine to prompt for any ASCII values'
  1780. ' $PAGE
  1781. '
  1782. '  SUBROUTINE NAME    -- GETASCII
  1783. '
  1784. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  1785. '                        TITLE$                  HEADER EXPANATION FOR PARAM
  1786. '
  1787. '  OUTPUT PARAMETERS  -- STRNG$                  RESULTANT CONFIG PARAMETER
  1788. '
  1789. '  SUBROUTINE PURPOSE -- ALLOWS ANY ASCII CHARACTER TO BE STORED IN A PARAMETER
  1790. '                        BY ENCLOSING IT IN SQUARE BRACKETS.  CHARACTERS NOT IN
  1791. '                        SQUARE BRACKETS ARE INTERPRETED EXACTLY AS ENTERED.
  1792. '                        CHARACTER'S ASCII VALUE EQUAL THE NUMERIC VALUE IN THE
  1793. '                        SQUARE BRACKETS.
  1794. '
  1795.       SUB GETASCII (TITLE$,STRNG$) STATIC
  1796. 61810 CLS
  1797.       LOCATE 8,30
  1798.       PRINT TITLE$;
  1799.       LOCATE 13,5
  1800.       PRINT "Current value is"
  1801.       PRINT STRNG$
  1802.       PRINT
  1803.       PRINT "Please enter the new values by entering the character"
  1804.       PRINT "or enclosing its ASCII value in square brackets:"
  1805.       PRINT "(Press ENTER to make empty)
  1806.       LINE INPUT "";HJ$
  1807.       STRNG$ = HJ$
  1808.       END SUB
  1809. ' $SUBTITLE: 'BRKFNAME - subroutine to decompose a file name'
  1810. ' $PAGE
  1811. '
  1812. '  SUBROUTINE NAME    -- BRKFNAME
  1813. '
  1814. '  INPUT PARAMETERS   -- PARAMETER                     MEANING
  1815. '                        FILENAME$       NAME OF THE FILE TO BE DECOMPOSED
  1816. '                        FOR.JOINING     INDICATOR IF OUTPUT IS TO BE COMPBINED
  1817. '
  1818. '  OUTPUT PARAMETERS  -- DRVPATH$        DRIVE AND PATH
  1819. '                        PREFIX$         8-CHARACTER FILE NAME PREFIX
  1820. '                        EXTENSION$      3-CHARACTER EXTENSION
  1821. '
  1822. '  SUBROUTINE PURPOSE -- BREAKS DOWN A FILE NAME INTO A DRIVE AND PATH,
  1823. '                        FILE PREFIX (8 CHARACTERS), AND FILE EXTENSION
  1824. '                        (3 CHARACTERS).  IF "FOR.JOINING" IS TRUE, THE
  1825. '                        DRIVE AND PATH HAVE A ":" AND A "\" IN IT AND
  1826. '                        THE EXTENSION BEGINS WITH A ".".
  1827. '
  1828.       SUB BRKFNAME (FILENAME$,DRVPATH$,PREFIX$,EXTENSION$,FOR.JOINING) STATIC
  1829. 61830 CALL ALLCAPS (FILENAME$)
  1830.       DRVPATH$ = ""
  1831.       PREFIX$ = ""
  1832.       EXTENSION$ = ""
  1833.       CALL TRIMTRAIL (FILENAME$,"\")
  1834.       IF LEN(FILENAME$) < 1 THEN _
  1835.          EXIT SUB
  1836.       CALL FINDLAST (FILENAME$,"\",X,Y)
  1837.       IF X < 1 THEN _
  1838.          IF MID$(FILENAME$,2,1) = ":" THEN _
  1839.             DRVPATH$ = LEFT$(FILENAME$,1): _
  1840.             S = 3 _
  1841.          ELSE S = 1 _
  1842.       ELSE DRVPATH$ = LEFT$(FILENAME$,X - 1) : _
  1843.            S = X + 1
  1844.       X = INSTR(FILENAME$+".",".")
  1845.       EXTENSION$ = MID$(FILENAME$,X + 1,3)
  1846.       PREFIX$ = MID$(FILENAME$,S,X - S)
  1847.       IF NOT FOR.JOINING THEN _
  1848.          EXIT SUB
  1849.       IF LEN(DRVPATH$) = 1 THEN _
  1850.          DRVPATH$ = DRVPATH$ + ":"
  1851.       IF INSTR(DRVPATH$,"\") > 0 THEN _
  1852.          DRVPATH$ = DRVPATH$ + "\"
  1853.       IF LEN(EXTENSION$) > 0 THEN _
  1854.          EXTENSION$ = "." + EXTENSION$
  1855.       END SUB
  1856. '
  1857. '  $SUBTITLE: 'TRIMTRAIL - subroutine to trim off trailing characters'
  1858. '  $PAGE
  1859. '
  1860. '  SUBROUTINE NAME    --  TRIMTRAIL
  1861. '
  1862. '  INPUT PARAMETERS   --  PARAMETER           MEANING
  1863. '                         TRIM.PARM$  TIME IN SECONDS AFTER MIDNIGHT TO WAIT
  1864. '                                     BEFORE DISPLAYING
  1865. '                         TRIM.THIS$  WHAT CHARACTER TO TRIM OFF END
  1866. '
  1867. '  OUTPUT PARAMETERS  --  NONE
  1868. '
  1869. '  SUBROUTINE PURPOSE --  TO DISPLAY RBBS-PC's SYSOP MENU ON THE LOCAL SCREEN
  1870. '
  1871. 61840 SUB TRIMTRAIL (TRIM.PARM$,TRIM.THIS$) STATIC
  1872.       WHILE RIGHT$(TRIM.PARM$,1) = TRIM.THIS$
  1873.          TRIM.PARM$ = LEFT$(TRIM.PARM$,LEN(TRIM.PARM$) - 1)
  1874.       WEND
  1875.       END SUB
  1876. ' $SUBTITLE: 'FINDLAST - subroutine to find last occurence of a string'
  1877. ' $PAGE
  1878. '
  1879. '  SUBROUTINE NAME    -- FINDLAST
  1880. '
  1881. '  INPUT PARAMETERS   -- PARAMETER             MEANING
  1882. '                        LOOK.IN$           STRING TO LOOK INTO
  1883. '                        LOOK.FOR$          STRING TO SEARCH FOR
  1884. '
  1885. '  OUTPUT PARAMETERS  -- WHERE.FOUND        POSITION IN LOOK.IN$ THAT
  1886. '                                            LOOK.FOR$ FOUND
  1887. '                        NUM.FINDS          HOW MANY OCCURENCES IN LOOK.IN$
  1888. '
  1889. '  SUBROUTINE PURPOSE -- FINDS THE LAST OCCURANCE OF "LOOK.FOR$" IN "LOOK.IN$"
  1890. '                        AND RETURNS COUNT OF NUMBER OF OCCURENCES.  IF NONE
  1891. '                        ARE FOUND, BOTH RETURNED PARAMETERS ARE ZERO.
  1892. '
  1893.       SUB FINDLAST (LOOK.IN$,LOOK.FOR$,WHERE.FOUND,NUM.FINDS) STATIC
  1894. 61850 WHERE.FOUND = INSTR(LOOK.IN$,LOOK.FOR$)
  1895.       NUM.FINDS = -(WHERE.FOUND > 0)
  1896.       NEXT.FOUND = INSTR(WHERE.FOUND + 1,LOOK.IN$,LOOK.FOR$)
  1897.       WHILE NEXT.FOUND > 0
  1898.          NUM.FINDS = NUM.FINDS + 1
  1899.          WHERE.FOUND = NEXT.FOUND
  1900.          NEXT.FOUND = INSTR(WHERE.FOUND + 1,LOOK.IN$,LOOK.FOR$)
  1901.       WEND
  1902.       END SUB
  1903. ' $SUBTITLE: 'SECURE - subroutine to assign security to commands'
  1904. ' $PAGE
  1905. '
  1906. '  SUBROUTINE NAME    -- SECURE
  1907. '
  1908. '  INPUT PARAMETERS   -- PARAMETER             MEANING
  1909. '                        SECTION$           NAME OF THE SECTION
  1910. '                        DEFAULTS$          DEFAULT COMMANDS FOR THE SECTION
  1911. '                        NUMBER.OF.COMMANDS NUMBER OF COMMANDS IN THE SECTION
  1912. '                        COMMANDS$()        CHARACTERS REPRESENTING THE ONE-
  1913. '                                              CHARACTER COMMANDS
  1914. '                        COMMANDS()         SECURITY LEVEL ASSOCIATED WITH
  1915. '                                           THE COMMAND
  1916. '                        SECTION.COMMANDS$  PROMPT STRING OF ALL COMMANDS IN
  1917. '                                             THE SECTION
  1918. '
  1919. '  OUTPUT PARAMETERS  -- COMMANDS$()        CHARACTERS REPRESENTING THE ONE-
  1920. '                                              CHARACTER COMMANDS
  1921. '                        COMMANDS()         SECURITY LEVEL ASSOCIATED WITH
  1922. '                                           THE COMMAND
  1923. '                        SECTION.COMMANDS$  PROMPT STRING OF ALL COMMANDS IN
  1924. '                                             THE SECTION
  1925. '
  1926. '  SUBROUTINE PURPOSE -- ALLOWS USERS TO MODIFY COMMANDS AND SECURITY FOR
  1927. '                        EACH COMMAND.
  1928. '
  1929.       SUB SECURE (SECTION$,DEFAULTS$,NUMBER.OF.COMMANDS,COMMANDS$(2),COMMANDS(1),SECTION.COMMANDS$) STATIC
  1930. 61860 IF IPAGE = 2 OR _
  1931.          VAL(OPTION$) = 310 THEN _
  1932.          XX$ = "ALL " + _
  1933.                SECTION$ + _
  1934.                " commands use default letters?" _
  1935.       ELSE XX$ = "ALL " + _
  1936.                SECTION$ + _
  1937.                " commands = SAME security level?"
  1938.       LOCATE 24,1
  1939.       PRINT SPACE$(79);
  1940.       LOCATE 24,1
  1941.       CALL GETNUMYN (XX$,AB)
  1942.       IF NOT AB THEN _
  1943.          GOTO 61880
  1944. 61870 IF IPAGE = 2 OR _
  1945.          VAL(OPTION$) = 310 THEN _
  1946.          SECTION.COMMANDS$ = DEFAULTS$ : _
  1947.          FOR I = 1 TO NUMBER.OF.COMMANDS : _
  1948.             COMMANDS$(I,2) = MID$(SECTION.COMMANDS$,I,1) : _
  1949.          NEXT : _
  1950.          EXIT SUB
  1951.       CALL MMINTEGER("Security level for all " + _
  1952.                       SECTION$ + _
  1953.                      " commands is?",-32767,32767,B1)
  1954.       FOR I = 1 TO NUMBER.OF.COMMANDS
  1955.          COMMANDS(I) = B1
  1956.       NEXT
  1957.       GB = B1
  1958.       EXIT SUB
  1959. 61880 GOSUB 61900
  1960.       IROW = 4
  1961.       ICOL = 10
  1962.       FOR I = 1 TO NUMBER.OF.COMMANDS
  1963.          LOCATE IROW + I,ICOL
  1964.          IF IPAGE = 2 OR _
  1965.             VAL(OPTION$) = 310 THEN _
  1966.             PRINT COMMANDS$(I,1);" ";COMMANDS$(I,2) _
  1967.          ELSE PRINT COMMANDS$(I,1);STR$(COMMANDS(I))
  1968.       NEXT
  1969. 61890 CALL ASKRO("Enter first character of command ([ENTER] quits)",24,X$)
  1970.       IF X$ = "" THEN _
  1971.          EXIT SUB
  1972.       IF LEN(X$) <> 1 THEN _
  1973.          GOTO 61890
  1974.       CALL ALLCAPS(X$)
  1975.       FF = INSTR(DEFAULTS$,X$)
  1976.       IF FF = 0 THEN _
  1977.          GOTO 61890
  1978.       IF IPAGE = 2 OR _
  1979.          VAL(OPTION$) = 310 THEN _
  1980.          GOTO 61892
  1981.       CALL MMINTEGER("Security level for all " + _
  1982.                       SECTION$ + _
  1983.                      " '" + _
  1984.                      X$ + _
  1985.                      "' commands is?",-32767,32767,B1)
  1986.       GOTO 61893
  1987. 61892 CALL ASKRO("New command for " + _
  1988.                   MID$(COMMANDS$(FF,1),1,INSTR(COMMANDS$(FF,1),"  ")) + _
  1989.                  "is?",24,HK$)
  1990.       X$ = MID$(HK$,1,1)
  1991.       CALL ALLCAPS (X$)
  1992.       IF LEN(HK$) > 1 THEN _
  1993.          HK$ = X$ + MID$(HK$,2)
  1994.       IF LEN (HK$) = 1 THEN _
  1995.          HK$ = X$
  1996.       COMMANDS$(FF,2) = HK$
  1997.       MID$(SECTION.COMMANDS$,FF,1) = HK$
  1998.       GOTO 61880
  1999. 61893 COMMANDS(FF) = B1
  2000.       GOTO 61880
  2001. '
  2002. ' * COMMON ROUTINE TO DISPLAY SUBSYSTEM COMMANDS AND THEIR SECURITY LEVELS
  2003. '
  2004. 61900 CLS
  2005.       I! = FRE(C$)
  2006.       COLOR 0,7,0
  2007.       LOCATE 1,23
  2008.       PRINT "RBBS-PC "+ CONFIG.VERSION$ + " Default Configuration";
  2009.       COLOR FG,BG,BORDER
  2010.       LOCATE  2,5
  2011.       PRINT "The RBBS-PC " + _
  2012.              SECTION$ + _
  2013.             " Commands are as follows:"
  2014.       LOCATE   3,10
  2015.       XX$ = "Command             Security"
  2016.       IF IPAGE = 2 OR _
  2017.          VAL(OPTION$) = 310 THEN _
  2018.          XX$ = "Description         Command"
  2019.       PRINT XX$
  2020.       RETURN
  2021.       END SUB
  2022. '  $SUBTITLE: 'GETCOLOR - get colors using natural language'
  2023. '  $PAGE
  2024. '
  2025. '  SUBROUTINE NAME    -- GETCOLOR
  2026. '
  2027. '  INPUT PARAMETERS   -- PARAMETER             MEANING
  2028. '                        STRNG$             TITLE OF WHAT COLOR IS FOR
  2029. '                        NUM.COLOR          CURRENT COLOR SETTING
  2030. '
  2031. '  OUTPUT PARAMETERS  -- NUM.COLOR          NEW COLOR SETTING
  2032. '
  2033. '  SUBROUTINE PURPOSE -- SET THE COLOR USING NATURAL LANGUAGE PHRASES
  2034. '
  2035.       SUB GETCOLOR (STRNG$,NUM.COLOR) STATIC
  2036.       CLS
  2037. 61950 IF NUM.COLOR > 7 THEN _
  2038.          X = NUM.COLOR - 8 _
  2039.       ELSE X = NUM.COLOR
  2040.       X$ = MID$("<none>Blue  Green Cyan  Red   PurpleYellowWhite",X*6+1,6)
  2041.       LOCATE 9,15
  2042.       PRINT STRNG$;" now ";X$;"     ";
  2043. 61955 CALL ASKRO ("Make N)one,R)ed,G)reen,Y)ellow,B)lue,P)urple,C)yan,W)hite,[ENTER] quits",20,ANS$)
  2044.       IF ANS$ = "" THEN _
  2045.          EXIT SUB
  2046.       CALL ALLCAPS (ANS$)
  2047.       Y = INSTR("NBGCRPYW",ANS$) - 1
  2048.       IF Y < 0 THEN _
  2049.          GOTO 61955
  2050.       NUM.COLOR = Y
  2051.       GOTO 61950
  2052.       END SUB
  2053. ' $SUBTITLE: 'GETANSI - SUBROUTINE TO GET CALLERS COLOR VALUES'
  2054. ' $PAGE
  2055. '
  2056. '  SUBROUTINE NAME    -- GETANSI
  2057. '
  2058. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  2059. '                        SELECTION$       NAME OF SELECTION TO HAVE COLOR
  2060. '                        PRMPT$           WHAT TO PROMPT ON THE SCREEN
  2061. '
  2062. '  OUTPUT PARAMETERS  -- FG.1.DEF$        FIRST COLOR SELECTION
  2063. '                        FG.2.DEF$        SECOND COLOR SELECTION
  2064. '                        FG.3.DEF$        THIRD COLOR SELECTION
  2065. '                        FG.4.DEF$        FOURTH COLOR SELECTION
  2066. '
  2067. '  SUBROUTINE PURPOSE -- ASK THE SYSOP TO SELECT THE FOUR COLORS TO BE
  2068. '                        USED FOR CALLERS THAT SELECT COLOR DISPLAYS.
  2069. '
  2070.       SUB GETANSI (SELECTION$,PRMPT$) STATIC
  2071.       CLS
  2072. 62000 LOCATE 8,10
  2073.       PRINT PRMPT$;" Foreground for caller now ";SELECTION$;"       "
  2074.       LOCATE 10,1
  2075.       PRINT "Current foreground selections: ";
  2076.       CALL COLORCODE (FG.1.DEF$,X$,X)
  2077.       COLOR X,CALLER.BKGRD
  2078.       PRINT "First ";
  2079.       CALL COLORCODE (FG.2.DEF$,X$,X)
  2080.       COLOR X
  2081.       PRINT "Second ";
  2082.       CALL COLORCODE (FG.3.DEF$,X$,X)
  2083.       COLOR X
  2084.       PRINT "Third ";
  2085.       CALL COLORCODE (FG.4.DEF$,X$,X)
  2086.       COLOR X
  2087.       PRINT "Fourth"
  2088.       COLOR FG,BG
  2089. 62040 CALL ASKRO ("Make N)one,R)ed,G)reen,Y)ellow,B)lue,P)urple,C)yan,W)hite,[ENTER] quits",14,ANS$)
  2090.       IF ANS$ = "" THEN _
  2091.          EXIT SUB
  2092.       CALL ALLCAPS (ANS$)
  2093.       X = INSTR("NRGYBPCW",ANS$)
  2094.       IF X < 2 THEN _
  2095.          SELECTION$ = NONE.PICKED$ : _
  2096.          GOTO 62000
  2097.       X$ = MID$("Red   Green YellowBlue  PurpleCyan  White",X*6-11,6)
  2098.       CALL ASKRO ("Make "+X$+" [B]right, or N)ormal",17,ANS$)
  2099.       CALL ALLCAPS (ANS$)
  2100.       IF ANS$ <> "N" THEN _
  2101.          SELECTION$ = "Bright " + X$ _
  2102.       ELSE SELECTION$ = "Normal " + X$
  2103.       GOTO 62000
  2104.       END SUB
  2105. ' $SUBTITLE: 'COLORCODE - SUBROUTINE TO GET COLOR CODES'
  2106. ' $PAGE
  2107. '
  2108. '  SUBROUTINE NAME    -- COLORCODE
  2109. '
  2110. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  2111. '                        NAT.LANG.COLOR$  NATURAL LANGUAGE LETTER OF COLOR
  2112. '                                           N = NONE
  2113. '                                           B = BLUE
  2114. '                                           G = GREEN
  2115. '                                           C = CYAN
  2116. '                                           R = RED
  2117. '                                           P = PURPLE
  2118. '                                           Y = YELLOW
  2119. '                                           W = WHITE
  2120. '
  2121. '  OUTPUT PARAMETERS  -- ANSI.COLOR$      CORRECT CHARACTER SEQUENCE OF COLOR
  2122. '                        BASIC.FG         NUMBER FOR BASIC FORGROUND
  2123. '
  2124. '  SUBROUTINE PURPOSE -- TO CONVERT THE NATURAL LANGUAGE COLOR SELECTION INTO
  2125. '                        COLOR CODES THAT ARE MEANINGFUL.
  2126. '
  2127.       SUB COLORCODE (NAT.LANG.COLOR$,ANSI.COLOR$,BASIC.FG) STATIC
  2128.       BASIC.FG = 7
  2129.       IF NAT.LANG.COLOR$ = NONE.PICKED$ THEN _
  2130.          ANSI.COLOR$ = "" : _
  2131.          EXIT SUB
  2132.       X = INSTR(" BN",LEFT$(NAT.LANG.COLOR$,1))
  2133.       IF X < 2 THEN _
  2134.          EXIT SUB
  2135.       X$ = MID$("10",X-1,1)
  2136.       X = INSTR(NAT.LANG.COLOR$," ")
  2137.       IF X < 1 OR X >= LEN(NAT.LANG.COLOR$) THEN _
  2138.          EXIT SUB
  2139.       Z$ = MID$(NAT.LANG.COLOR$,X+1,1)
  2140.       X = INSTR("RGYBPCW",Z$)
  2141.       IF X < 1 THEN _
  2142.          EXIT SUB
  2143.       BASIC.FG = INSTR("BGCRPYW",Z$) - 8 * (X$="1")
  2144.       Y$ = MID$(STR$(30+X),2)
  2145.       Z = INSTR("NRGYBPCW",MID$("NBGCRPYW",CALLER.BKGRD+1,1))
  2146.       Z$ = MID$(STR$(39+Z),2)
  2147.       ANSI.COLOR$ = CHR$(27) + "[" + X$ + ";" + Z$ + ";" + Y$ + "m"
  2148.       END SUB
  2149. ' $SUBTITLE: 'ANSIDECODE - SUBROUTINE TO DECODE ANSI VALUES'
  2150. ' $PAGE
  2151. '
  2152. '  SUBROUTINE NAME    -- ANSIDECODE
  2153. '
  2154. '  INPUT PARAMETERS   -- PARAMETER                      MEANING
  2155. '                        ANSI.EXPRESSION$ EXPRESSION WITH ANSI COLOR CODES IN
  2156. '
  2157. '  OUTPUT PARAMETERS  -- ANSI.EXPRESSION$ ENGLISH LANGUAGE DESCRIPTION OF COLOR
  2158. '
  2159. '  SUBROUTINE PURPOSE -- DECODES THE ANSI EXPRESSION INTO A MEANINGFUL
  2160. '                        ENGLISH TEXT DESCRIPTION.
  2161. '
  2162.       SUB ANSIDECODE (ANSI.EXPRESSION$) STATIC
  2163.       IF LEN (ANSI.EXPRESSION$) < 3 THEN _
  2164.          EXIT SUB
  2165.       IF ASC(ANSI.EXPRESSION$) <> 27 THEN _
  2166.          EXIT SUB
  2167.       X = INSTR(ANSI.EXPRESSION$,";")
  2168.       IF X < 1 THEN _
  2169.          EXIT SUB
  2170.       IF MID$(ANSI.EXPRESSION$,X-1,1) = "1" THEN _
  2171.          X$ = "Bright " _
  2172.       ELSE X$ = "Normal "
  2173.       X = INSTR(X,ANSI.EXPRESSION$,"m")
  2174.       IF X < 1 THEN _
  2175.          EXIT SUB
  2176.       X = VAL(MID$(ANSI.EXPRESSION$,X-2,2)) - 30
  2177.       IF X < 1 OR X > 7 THEN _
  2178.          EXIT SUB
  2179.       ANSI.EXPRESSION$ = X$ + MID$("Red   Green YellowBlue  PurpleCyan  White",X*6-5,6)
  2180.       END SUB
  2181.